kShell:Wz コンソール・マクロ

●● 始めに ●●

● ライセンス条件

kShell.txc(ts,txc) は熊谷氏の開発した shell.txc に小林が手を加えたものです。shell.txt と同様に GPL 条件で公開します。ただし、kShell.txc(ts,txc) は、sf 数式の貼付け実行などを実現するために、様々の変更を入れています。kShell.txt(ts.txc) についての熊谷氏に質問しないで下さい。また sf 数式貼付け実行のために BlockExe.txc マクロを追加しました。こちらも GPL 条件の元に公開します。

責任範囲について

kShell.txc(ts.txc) および BlockExe.txc は GPL 条件のもとに配布します。これらの使用をを原因として発生した損失や損害について一切の責任を負いません。

また、これらのソフトの改良は続けていくつもりですが、それを約束するものではありません。

● kShell, BlockExe Wz マクロとは

kShell, BlockExe Wz マクロは、MS Windows でのコンソール環境を使いやすくするものです。コンソールでの文字列処理を Wz エディタでの文字列処理と同様に行えるようにしています。昔の Vz エディタのコンソール・モードのような使い方を想定しています。

また、コンソールとは別のエディタ画面上にある sf 数式やコンソール・コマンドなどを貼り付けて実行する機能も組み込んであります。さらには //@@ から //@@@ の範囲の文字列ブロックをコンパイルすることも可能にしました。

kShell は、コマンド・ライン電卓ソフト sf を使った計算操作を容易にすることに一番の力を注ぎました。これ以上の sf を使いやすくする方法は殆ど残っていないと考えます。一方で GDB デバッガとの組み合わせ利用については改良の余地が多く残っています。kShell を皆様にも改良していただくことを望んでいます。

kShell, BlockExe Wz マクロを使うことで、Windows の操作環境が大きく変わります。マウスの使用頻度を極限にまで少なくできます。是非ともお試しください。

kShell.txc と ts.txc について

kShell.txc は熊谷氏の作成した shell.txc に小林が修正を加えたものの正式バージョンのファイル名です。ts.txc は kShell.txc のテスト・バージョンです。現在(2004年11月)のところ ts.txc のみが存在します。kShell.txc は存在しません。 配布するのは ts.txc と BlockExe.txc のソースと、それらをコンパイルした txm ファイルです。



●● kShell を使ってみましょう ●●

● インストール

解凍

とくにインストーラーを設けていません。レジストリや環境変数を操作することはありません。kShell.zip を解凍して ts.txc, ts.txm, BlockExe.txc, BlockExe.txm, shell.exe を ??\wz4\macro\にコピーします。後は Wz.key を呼び出す関数名と、それに対応するキー操作を登録だけです。

Wz キーの設定

wz4\WZ.KEY ファイルをエディタで開いて "[My key]" 以下の行に下のように、マクロ関数名と、それを呼び出すキー操作を指定します
    //コンソール貼付け実行マクロ
    BlockExe.ExecuteLineAsIs = ^OA
    BlockExe.ExecuteLineAsIsDown = ^OZ
    //Echo back mode toggle マクロ
    BlockExe.InvertEchoBackMode = ^OI

    //start 貼付け実行マクロ
    BlockExe.ExecuteWithStartAsIsDown = ^OF

    //ブロック実行マクロ
    BlockExe.BlockExecute = ^OE

    //sf 数式実行マクロ
    BlockExe.ExecuteExpressionAsIs = ^ON
    BlockExe.SfBlockExecute = ^OS

    //Pythonブロック実行マクロ
    BlockExe.PyBlockExecute = ^OP
    //Googl 検索マクロ
    BlockExe.StartGoogle = ^OG


もちろん、キー設定はユーザーの好きなように変更ください。

kShell マクロの起動

なんらかの Wz editor 画面をたちあげ、その中で下の操作をすることで kShell を立ち上げます。
    //「マクロの実行」のダイアログ・ウィンドウを出します
    alt + T  ==> X 
    // "ts" を指定して kShell WZ 画面を出させます
  
「編集位置を保存」する設定を推奨します。kShell 画面で Alt + V ==> O 操作を行って、オプション・タブ・ウィンドウを開きます。その他タブを選択して "□編集位置を保存(J)" をチェックすることで kShell ウィンドウの位置とサイズを保存して、前回 kShell を閉じたときと同じ位置とサイズで kShell が立ち上がるようになります。

私は 「\a.bat」 に下のような Wz を立ち上げるコマンドを書いておき、「スタート」 ==> 「ファイル名を指定して実行」の 「\a」を実行させます。その後に上の "alt+T" 以下の操作を行って kShell 画面を作っています

    type \a.bat
    start \utl\wz4\wzeditor.exe \job\vrfy\doc\exprt\sf.htm

本当は、「\a.bat」に kShell マクロを立ち上げるコマンドを書いておきたいのですが、その方法が見つかりません。うまい方法があるときは教えていただけますでしょうか。


● Windows コンソールに備わっている機能と、kShell による改善

コンソールの立ち上げ

標準の Window コンソールは下の操作でも立ち上げられます。
    スタート ==> ファイル名を指定して実行 ==> ダイアログ画面で "cmd" 文字列と Enter を打ち込む
  

同様なことが kShell 画面上で "start cmd" と打ち込むだけで実行できます。こっちのほうが簡単でしょう。

どちらで、立ち上げるにせよ、kShell とは別なプロセスとして、コンソールが立ち上がっています。kShell など他の処理と平行して、コンソール内で別のプログラムを実行させられます。chkdsk や xcopy バック・アップなどの時間のかかる処理は、kShell とは別にコンソールを立ち上げて、そこで実行させたほうが効率的です。

cmd 画面と kShell 画面の二つが立ち上がっている状態で、両者を比較しながら kShell でのコマンド操作の優位性を見ていきましょう。

Windows コンソールと kShell でのコマンド操作

Windows コンソール/kShellの両方でコマンドをキーボードから打ち込みます。そのコマンドの動作結果もコンソール/kShell に表示されます。下のコマンドを打ってみましょう
#   make directory: test と言う名前のディレクトリをカレント・ディレクトリに新たに作ります
    mkdir test

#   change directory: test ディレクトに移ります。
    cd test

#   directory 操作の結果をリダイレクトにより temp.txt に書き出させます
    dir > temp.txt

#   kShell でリダイレクト操作をするとき行頭に ">" または ";;" 文字を追加します
    >dir > temp.txt
    ;;dir > temp.txt
kShell での ">", ";;"

kShell のコマンド文字列に ">" を含むときは行頭に ";;" や ">" を追加する必要があります。kShell では、Enter キーを押したときカーソルの置かれている行全部の文字列がコマンド文字列とみなして shell に渡してやります。コマンド プロンプトを使うことがあるので、">" があるときは、その次からの文字列をコマンド文字列だとみなしてシェルに実行させます。でも、今度はプロンプトがなくてリダイレクト コマンドを使おうとしたときに困ります。そのためリダイレクトでコマンド文字列に > が入るときは ;; をコマンドの前に付けることにしました。

time コマンドなど、応答文字列が必要になるときがあります。そのときも ">"/";;" が必要になります。kShell では shell 画面上の任意の文字列を編集でき、enter を押したときにカーソルのある行の文字列を shell におくります。コマンドからの応答文字列があるときは、返事の文字列との境目が必要になります。kShell は ">"/";;" を境目の目印:デリミタにしています。

例えば "del *.*" コマンドでの応答文字列で Y/N などの部分文字を返すときに困るので ";;" と ">" をデリミタ文字としています。たとえば

# *.* は全てのファイルを意味します。
del *.*
# 全てのファイルを消そうとすると、Windows OS は下のような確認コメントを表示します
C:\my\vc7\mtCm\test\*.*、よろしいですか (Y/N)? >Y

このとき kShell では ">" デリミタ文字列を y 返答文字の前に挿入してやる必要があります。そうしないと y だけではなく "C:\my\vc7\mtCm\*\test\*.*、よろしいですか (Y/N)? y" 文字列全部を入力したことになるからです。(この長い文字列を返すと Windows OS は不自然な文字列であると判断して、同じ確認文字列を何度も返してきます。)

この点については kShell ことを使うことで余分な手間が必要になることになります。でも、こんな手間の何十倍も便利になりますので我慢してください。

さらに下のコマンドを続けて実行してみてください。

#   dir コマンドのリダイレクトされた結果をコンソールに表示します
    type temp.txt

#   この下の行は type コマンドの応答結果です。"dir > temp.txt" リダイレクト
#   コマンドにによって作られた temp.txt の中身です
     ドライブ C のボリューム ラベルは ボリューム です
     ボリューム シリアル番号は AC61-5053 です

     C:\job\vrfy\doc\exprt\test のディレクトリ

    2004/11/22  13:27       <DIR>          .
    2004/11/22  13:27       <DIR>          ..
    2004/11/22  13:27                    0 temp.txt
                   1 個のファイル                   0 バイト
                   2 個のディレクトリ  49,915,056,128 バイトの空き領域
type コマンドでのように、kShell にコマンドが出力する文字列が Windows コンソールのときと同様に、kShell ウィンドウにも表示されてきます。この意味で kShell は Emacs のコンソール・モードと同様な動きをします。

さらに次の del コマンドを打ちでみます

    del *.*
    C:\job\vrfy\doc\exprt\test\*.*、よろしいですか (Y/N)? >y

del *.* コマンドによってカレント・ディレクトリを空にした後に下の二つのコマンドを実行するとtest ディレクトリを作る前の最初の状態に戻ります。

#   一つルート側のディレクトリに戻ります。 .. は一つ上のディレクトリを意味します。
    cd .,

#   remove directory: test ディレクトリを消します(remove)
    rd test

ここまでのコンソール操作をすると、デフォルトの Windows コンソール・ウィンドウでは最初の mkdir などのコマンド操作文字列がウィンドウ枠の外側に出てしまっているはずです。デフォルトの Windows コンソール では 25 行分しか表示できないからです。コンソール・ウィンドウの上側に押し出されてしまった最初の部分を診るためには。マウスを使ってスクロール・バーにより、押し出された部分を戻したたりしなければなりません。

kShell 側ならば、画面を巻き戻す操作に ctrl+R などの手慣れたエディタ・キー操作を使えます。マウスを使う必要はありません。巻き戻しだけに限りません。kShell 画面は shell 画面であると同時に Wz の画面であり、Wz エディタで使える全ての操作が kShell 上でも可能です。Windows コンソールでのようにカーソル・キーやファンクションキー、マウス・キーの操作を共用されることはありません。全ての操作をキー・ボードのホーム・ポジションから行えます。

次に述べるコマンド行の編集操作も Wz と同じキー操作で可能です。

● Windows コンソールと kShell での行編集

Wendows コンソールでは ctrl + ↑/↓カーソル・キーを使って以前に使ったコマンド履歴文字列を表示でき ます。 rd test, cd .., del *.* と以前に打ち込んだコマンド文字列が出てきます。コマンド文字列は何十文字もの大きさになることが多くあります。このときコマンド履歴機能は活用できます。

でも、カーソル・キーを操作するにはホーム・ポジションを崩さねばなりません。kShell では ctrl + 0/9 にも、コマンド履歴を表示する機能を割り振ってあります。ホーム・ポジションを崩さずに済ませられるようにしてあります。( なお ctrl+0/9 は ts.txc に hard cording してあります。kShell ウィンドウがアクティブのときのみ有効です。)

コマンド履歴で戻した文字列は、一部分を編集し直してからコマンドを実行されることも多くあります。 Windows コンソールのときは ←/→キーでカーソルを移動し、delete/Back space キーで文字を消し、文字の挿入または上書きによつてコマンドを編集できます。これらの操作もホーム・ポジションを保てません。kShell なはらば、エディタの文字列編集操作がそのまま使えます。Emacs の shell モードも同じです。

● kShell での平面編集とコマンド実行

kShell では一行の編集とコマンド実行だけではなく、二次元画面にある文字列編集してコマンドとしてを実行させられます。kShell 上で enter 釦を押せば、カーソルが置かれている行の文字列をコマンド文字列として実行させます。実行結果は、カーソルが置かれていた行の次の行に挿入されます。

Emacs shell・モードでも同様に画面にあるコマンド文字列を実行できますができます。でも実行するときに最下行にカーソルを移してしまいます。kShell でのように、操作カーソル位置に実行結果を挿入するほうが多くの場合便利です。

二次元平面でのコマンド実行は、複雑なコンピュータ操作をより簡単にしてくれます。

  ■ type cm によるコマンドの選択実行
毎日コンピュータ上で行う作業には定形作業が多くあります。しかも、その定形作業は作業ディレクトリごとに、少しずつ変化します。私はこのような定形作業を cm ファイルに書いておきます。
    type cm
      ・
    >copy sfMtrx.cpp sfMtrxCpp.bak /v /y
    >start \lng\MSs\Common7\IDE\devenv MySTL.sln

ソースのテンポラリ・バックアップを取りたいときには、">copy sfMtrx.cpp sfMtrxCpp.bak /v /y" にカーソルを移して enter です。バックアップを bk1 などに変更することも、よく行います。こうすることにより、上の例のように長い文字列のコマンドでも、タイプ時間を書けることなく、タイプ・ミスをすることなく、快適に実行できます。拡張子を bak から bk1 に変えたいときは、bak の位置にカーソルを持っていきエディットするだけです。長いコマンドを bat ファイルでの実行で代用させると、このような素早い編集ができません。また bat ファイルは処理内容を隠してしまいます。kShell は cm ファイルは編集可能な visual bat 操作を可能にします。

">start \lng\MSs\Common7\IDE\devenv MySTL.sln" はデバッグのときに Vc7 IDE を立ち上げるときに使います。MySTL.sln プロジェクト・ファイルを指定して IDE を立ち下ます。こうすることで、IDE を立ち上げてからプロジェクトをオープンするような二度手間を避けられます。快適です。

Windows OS では、拡張子とアプリケーションに関連付けを設定できます。doc 拡張子には Word が関連付けられています。関連付けられたファイルは start コマンドの引数にファイル名と拡張子を書くだけで、関連したアプリケーションと一緒に立ち上がります。この機能と kShell の二次元平面でのコマンド実行を組み合わせると、dir コマンドで出させた Word ファイルを立ち上げる操作を下の様に行えます。長くてタイプ・ミスしやすいファイル名の入力を避けられます。

   dir *.doc
   2004/07/08  21:13               93,184 産業連関表の概要gaiyo.doc
               1 個のファイル              93,184 バイト
   # 上の "産業連関表..." の直前にカーソルを起き shift + enter 操作を行って、
   # ファイル名 "産業連関表..." で始まる行を作ります。その行頭に start を挿入します
   2004/07/08  21:13               93,184 
   start 産業連関表の概要gaiyo.doc
   #上の操作で、産業連関表の概要gaiyo.doc のファイルを開いた状態で Word がち立上がります

次に説明する "コマンド文字列の貼付け実行 " マクロを使えば、shift + enter や start の挿入作業も省略できます。

● デリミタ文字以降の start 実行 ctrl O + F

先にも述べましたが kShell では ">", ";;" はデリミタ文字列です。そして ctrl O + F:BlockExe.ExecuteWithStartAsIsDown マクロ関数の呼び出しは、デリミタ以降の文字列を取り出して kShell 上で実行させるマクロです。先の dir コマンドによって doc ファイルが kShell 上に出力されている状態ならば、下の様に操作することでも Word を立ち上げられます。

    dir *.doc
    2004/07/08  21:13               93,184 産業連関表の概要gaiyo.doc
          ↓
    # デリミタ文字 ">" を挿入すして ctrl + O F と操作する
    2004/07/08  21:13               93,184 >産業連関表の概要gaiyo.doc
          ↓
    # BlockExe.ExecuteWithStartAsIsDown マクロ関数がデリミタ以降の文字列に
    # 下のように start を追加して実行する
    start 産業連関表の概要gaiyo.doc


● リンク貼付け start 実行 ctrl O + F

ctrl O + F 操作による start 実行は任意の Wz エディタ画面上で働きます。kShell 画面に限りません。Ctrl O + F と操作されると、カーソルがある行のデリミタ以降の文字列を取り出して kShell window に貼り付けて実行させます。

デリミタ文字列を二種類 ";;",">" 用意してあるのは、編集しているエディタ行によっては、既に ">" 文字が使われていることがあるためです。";;" が使われることは非常に少ないからです。

デリミタ文字列によりコマンド行の切り出しは次のような優先順位で行われます

  1. まず ";;" 文字列が見つかったときは、 ";;" 以降をコマンドとします
  2. ";;" 文字列が無いときは ">" を探し、";;" 以降をコマンドとします。ただし、">" デリミタのより前に "<" 文字があるときは ">" デリミタを無効とします。<.....>とペアで使われることが多く、そのときは ">" をデリミタにすることは不適当だと考えています。
  3. ";;" ,">" どちらのデリミタも見つからないときは、カーソルのある行全部の文字列をコマンドとします。

この ctrl O + F マクロは Wz エディタの任意のテキスト行にリンクを貼れることを意味します。Word ファイル、GIF 画像ファイル、URL アドレスや wave ファイルなど Widnows で関連付けられている任意のファイルをリンクできます。関連付けられていなファイルでも、対応する実行ファイルを一緒に書いてやることでリンクできます。

たとえばプログラムのコメントに、このリンクが使えます。プログラムのコメント中には書きにくい図形などを使った詳細説明をコメント部分にリンクしておけば、それを何時でも ctrl O + F で参照できます。リンク先を URL にしておけば、リンク先のアンカー位置まで指定することも可能です。

ただし for(;;){...} のように無限ループを記述行ではリンク start 実行を行わないでください。";;" デリミタ文字列が for 文の中にあるからです。そのときは for (;;) 文がない行に start 実行によるリンクを書いてやってください。

● 貼付け start なし実行 ctrl O + A

start は kShell と並列に別のプロセスでコマンドを実行させます。sf の計算など、別プロセスではなく kShell 上で実行させたいときもあります。そのときには ctrl O + A で BlockExe.ExecuteLineAsIs マクロ関数を実行させます。

● ブロック実行 ctrl O + E

sf では複数行の貼付け実行マクロ BlockExe.BlockExecute も用意しています。複数行に渡る sf 数式や、perl, c などのプログラムのコンパイル・実行を ctrl O + F の一回の操作だけで済ませます。

ブロック実行マクロでは //@@ または 行頭から //@@@ の範囲までを括り出して c:\#####.### ファイルにコピーします。そして //@@@ 以降の行に書かれている行頭が // か &tt; で始まるコマンド文字列を連続して実行します。行頭が //, > どちでもない行に辿り着くとマクロは終了します。

    //@@                              ファイルの先頭
      ↑                                ↑
      │                 or             │ <== この範囲を c:\#####.### にコピーする
      ↓                                ↓
    //@@@                             //@@@
    // 連続実行コマンド 1             >  連続実行コマンド 1
    >  連続実行コマンド 2             // 連続実行コマンド 2
         ・                                ・
    // 連続実行コマンド N             // 連続実行コマンド N

このマクロの具体な適用例を下に示します。カーソルを下のコード例の 3行目にある package main; に置いて ctrl O + E 操作をすると行頭から //@@@ の直前の 11 行目:} までを c:\#####.### にコピーします。続けて copy c:\#####.### #.prl /v コマンド、\lng\wPerl\bin\perl #.prl コマンドを実行させます。

同じファイルにある 22 行目の int main(void) にカーソル行を移して ctrl O + E 操作を行うと C++ プログラムの cl.exe によるコンパイルを行います。 32 行目にある gcc によるコンパイルは、空行があるため自動的には行いません。32 行目の gcc コンパイルを実行したいときは、gcc の行にカーソルを持っていき ctrl O + A 操作をします。

次の 35 から 40 行にあるパイソン・コードの実行は ctrl O + P で行います。42 行目などある copy \#####.### temp.py などは kShell マクロ側で自動的に補います。C 言語のときとは異なり、python コードを実行するときにはオプションを引き渡すことが少ないからです。43 行目のようにパイソンに引数を渡すときは 42 行目をとりさって //@@@ と連続させます。そして ctrl O + E のブロック実行をさせます。

    0001 #この位置がファイルの先頭です
    0002 #04.09.25 test "xa-y" =~ "[a-]+" <-- "a-a"
    0003 package main;
    0004 {
    0005     if ( "xa-ay" =~ /[a-]+/){     #<-- unmatch
    0006         print "MatchedString: $&    PreMatch: $`   PostMatch: $'\n";
    0007         print "\$1: $1\n";
    0008     }else{
    0009         print "Not Matched\n";
    0000     }
    0011 }
    0012 //@@@
    0013 >copy c:\#####.### #.prl /v
    0014 >\lng\wPerl\bin\perl #.prl
    0015 
    0016 //@@
    0017 //04.11.24 test string
    0018 #include
    0019 #include
    0020 using namespace std;
    0021 
    0022 int main(void)
    0023 {
    0024     string crStrAg("1.2e0");
    0025     size_t sztAt = crStrAg.find_first_not_of(" \t+-0123456789eE,");
    0026     cout << sztAt << endl;
    0027 }
    0028 //@@@
    0029 //copy c:\#####.### a.cpp /y
    0030 //cl a.cpp /MLd /W3 /Od /D"_CONSOLE" /Ivrf\ /YX /GX /GR /Fp#.pch
    0031 
    0032 //gcc a.cpp -g -I.\ -Ivrf\ -D"DfGcc_" libstdc++.a
    0033 
    0034 //@@
    0035 # 04.11.23 test reduce OK <== 55
    0036 def sum(seqAg):
    0037     def add(x,y): return x + y
    0038     return reduce(add, seqAg,2)
    0039 
    0040 print sum(range(1,11))
    0041 //@@@
    0042 
    0042 //copy \#####.### temp.py
    0043 //python temp.py arg

このプロック実効マクロは見た目以上に便利です。特に上に例示したような小さなテスト・プログラムを大量に作っていくときに下のような理由で便利です。お試しください

  1. 一つのファイルに何個でもテスト・プログラムを残していける
  2. 後になって再実行したいときは、そのプロックにカーソルを持っていき ctrl O + E と操作するだけでよい
  3. コンパイルオプションまで含めて残していける
  4. 一つのファイルにだけ grep や serch を行うことで、以前に作ったテスト・プログラムを探せる
  5. gcc, cl, perl, python など任意の言語に適用できる



● Google 検索 ctrl O + G

私の場合 google 検索を実行させる頻度が ctrl O + G 操作によって Google 検索をさせるようにしてあります。下のコマンドを kShell に貼り付けて実行させています。
    start http://www.google.com/intl/ja/
この BlockExe.txc にある "start http://www.google.com/intl/ja/" 文字列を別のコマンド文字列に変更できます。任意のソフトを開始させられるようになります。Wz マクロを弄れる方は、御自分がよく使うソフトに修正してみてください。



●● sf 計算 ●●

kShell は Wz エディタで計算ノートを書きながら sf に計算させることを容易にするようにも作ってあります。

● sf 数式行の計算 ctrl O + N

計算ノートに書いてある数式を、そのまま計算させられると便利です。 sf での計算をするためには、
  1. 計算ノートに書いてある数式をコピーし
  2. kShell 画面に貼付け
  3. 貼り付けた数式引を引用符で囲み
  4. 行頭に sf を追加する
作業を行わねばなりません。このような定型的な作業を BlockExe.ExecuteExpressionAsIs マクロに行わせています。下のように使います
    # 計算ノート側のエディタに書いてある sf 数式
    !log(!sin(π/3))

        ↓計算ノート・エディタ画面の数式行にカーソルを置いて ctrl O + N 操作をする

    # kShell ウインドウ画面---引用符で囲み sf を行頭に挿入して実行させる
    sf "    !log(!sin(π/3))"
     sf command argment: !log(!sin(π/3))
    < -0.143841 >
デリミタ文字列 ">" または ";;" を挟むことで、計算ノート側に書かれた数式の前にコメントを記述できます
    #計算ノート側のエディタに書いてある sf 数式
    等比級数> iniVal@=1, r@=2, N@=10, <<0,N,1@j|iniVal r^j>>

        ↓ ctrl O + N 操作

    sf " iniVal@=1, r@=2, N@=10, <<0,N,1@j|iniVal r^j>>"
     sf command argment: iniVal@=1
             ・
             ・
    <   1,   2,   4,   8,  16,  32,  64, 128, 256, 512 >

sf 数式では < と > が必ずペアで使われます。> より先に < が表れます。コマンド・プロンプトと sf 式の組み合わせのときは > が先に表れ、これがデリミタ文字になります。

もし万が一ディレクトリ文字列に "<" を使っているときはコマンド・プロンプト文字列の一部を含んで sf 式を実行してしまいます。そのときは ";;" デリミタ文字列を使ってください。

● sf 数式プロックの計算 ctrl O + S

//@@ と //@@@ 行の間に複数の sf 式を書いてあるとき、ctrl O + S 操作をすることで、そのブロックの sf 式を順次 実行していきます。

sf にはテキスト・ファイルに書かれた一連の sf 式を "sf @@ファイル名" で実行する機能があります。ですから、さきに述べたロック実効マクロ ctrl O + E を下の //@@ ... //@@@ に使うことで、sf 式のブロックを実行させることができます。

    # //@@ と //@@@ の間のどこかにカーソルを置いて ctrl O + E と操作する
    //@@
    N=100
    Δx=2π/N
    array = <<0,N,1@j| !cos(Δx j)>>
    #>gdsp array
    arIntgrl = <<1,N,1@j| !sum(array[<0,j,1>])Δx >>
    #>gdsp arIntgrl
    arSin = <<0,N,1@j| !sin(Δx j)>>
    !norm(arSin - arIntgrl)
    //@@@
    //copy \#####.### temp.se
    //sf @@temp.se

でも、copy \#####.### temp.se と sf @@temp.se の実行は sf のブロック計算では常に同じです。ならば、常に行う部分はマクロ側で処理してやったほうが便利です。それを実行するクロ側が BlockExe.SfBlockExecute: ctrl O + S マクロです。

# //@@ と //@@@ の間のどこかにカーソルを置いて ctrl O + S と操作する
//@@
    N=100
    Δx=2π/N
    array = <<0,N,1@j| !cos(Δx j)>>
    #>gdsp array
    arIntgrl = <<1,N,1@j| !sum(array[<0,j,1>])Δx >>
    #>gdsp arIntgrl
    arSin = <<0,N,1@j| !sin(Δx j)>>
    !norm(arSin - arIntgrl)
//@@@

< 0.384772 >

sf 数式行、数式プロックを計算させるマクロを使うことで、計算ノートに書いてある数式を手軽に計算できるようになります。kShell は、この sf の計算を容易にすることを一番の目標に作りました。


●● Python の ブロック実行 ●●

sf のときと同様に python スクリプト・ブロックを kShell に実行させられます copy \#####.### temp.py と python temp.py の実行を自動的に wz マクロから行わせます。それを実行するクロ側が BlockExe.PyBlockExecute: ctrl O + P マクロです。

Python の namarray などを使うことで可能な数値計算処理の範囲が広がります。sf から python ルーチンを呼び出せます。


●● maxima の kShell 計算 ●●

GPL で配布されている Maxima は Windows console の CUI でも使えます。この maxima CUI プログラムは kShell 上でも動きます。kShell 上の Wz エディタの編集コマンドの下で maxima が使えます。 グラフ表示をできないこと以外は、kShell 上での maxima のほうが使いやすいはずです。さらにエディタで書いていく計算ノート テキストの数式を ctrl O + A 貼付け実行マクロを利用して Maxima に計算させることで mxmaixma.exe より使いやすくできます。

でも、この maxima CUI への kShell マクロの適用は不完全です。私自身が自分で使う分には困らないレベルにできましたが、他人様に使っていただくレベルにはなっていないと考えます。この説明は、maxima CUI の shell モード・インターフェースを改良するプログラマーの方の参考資料と考えてください。

● maxima CUI の実行環境

maxima 自体のインストールは簡単です。http://maxima.sourceforge.net/ の "GEt it here" リンクにある Windows バイナリ:maxima-5.9.1.exe をダウンロードして実行させるだけです。でも、これだけでは maxima..exe を Windows console で動かせません。もう少し細工が必要です。

まず maxima をインストールした後にできている bin ディレクトリの maxima.exe を PATH の通ってディレクトリにコピーします。同じディレクトリに下の max.bat を作ります。

    type \utl\max.bat
    maxima.exe -eval "(user::run)" %1 %2 %3 %4 %5 %6 %7 %8 %9
後は kShell 上で "max" と打ち込むだけで CUI maximma が立ち上がります。単純に maxima.exe だけを起動すると "Use (help) to get some basic information on how to use GCL." と怒られて maxima が立ち上がりません。

● kShell の maxima モード

maxima の数式表示は tab 8 を前提としています。また "(Cn)" コマンド・プロンプトが CUI 画面に出てくるので、それを取り除いた入力文字列にせねばなりません。Maxima をエコー・バック・モードで動作させる必要もあります。このため BlockExe.InvertEchoBackMode: ctrl O + I マクロ呼び出して maxima モードであることを kShell に知らせてやる必要があります。

kShell はエコー・バック・モードに入ると、行頭の "(Cn)" 文字列を除いた maxima 数式文字列を shell 即ち maxima.exe に送ります。エコー・バック・モードでないと "(Cn)" も含めた数式を maxima.exe に送ってしまいます。Maxima.exe は "(Cn)" 数式処理文字列は異常であるとみなしてエラーにしてしまいます。

● maxima CUI への貼付け実行 ctrl O + A

Maxima GUI が kShell 上で立ち上がって ctrl O + I によってエコー・バック・モードにすると、数式にノート・エディタ画面に書かれている maxima 式を ctrl O + A によって kShell に貼付けて実行させることが可能になります。
    #計算ノート側のエディタに書いてある maxima 数式
    allroots( x^4 + x + 1);

        ↓数式行にカーソルを置いて ctrl O + A 操作をする

    # kShell maxima CUI ウインドウ画面
    (C4) allroots( x^4 + x + 1);
    (D4) [x = 0.93409928946053 %I + 0.7271360844912, 
    
    x = 0.7271360844912 - 0.93409928946053 %I, 
    
    x = 0.43001428832972 %I - 0.7271360844912, 
    
    x = - 0.43001428832972 %I - 0.7271360844912]


●● gdb の kShell 操作, 貼付け実行 ctrl O + A ●●

gdb 自体はコンソール・プログラムであり、kShell 上でも動作します。さらに kShell の貼付け実行マクロを利用すると、gdb の使い勝手が格段によくなります。私自身、プログラムの種類によっては Vc7 の IDE ではなくて kShell 上での gdb デバッグを選択することがよくあります。このマクロを作るまでは gdb 操作のために必要な typing の手数が多すぎて、Vc7 IDE を使わざるをえませんでした。

具体的には、デバッグ対象のプログラムにあわせた gdb コマンドを、gdb.txt などのテキスト・ファイルに書きあげてておきます。下のような具合です。

    type gdb.txt

        ・
    b kk::getCommand
    b ClTerm::readInverted
        ・
    #assembler debug
    info line
    disas $pc $pc+200
    ・
そして gdb を kShell 上で立ち上げておき、 gdb.txt::"disas $pc $pc+200" などの行にカーソルを持っていき ctrl O + A 操作により disas $pc $pc+200 を gdb 側に貼付け実行させます。

でも、この gdb への kShell マクロの適用は maxima 以上に不完全です。私自身が使う分には困らないレベルにできましたが、やはり人様に使っていただくレベルにはなっていないと考えます。この説明も gdb の shell モード・インターフェースを改良するプログラマーの方の参考資料と考えてください。

実際に gdb のために kShell.txc 側で行っているのは、下の行を追加して、先頭 (gdb) プロンプトを無視させているだけです。

    ts.txc::void exec_command(TX* text)
        ・
        ・
        if( (cmd[0]=='(')
         && (cmd[1]=='g')
         && (cmd[2]=='d')
         && (cmd[3]=='b')
         && (cmd[4]==')')
        ){
            cmd = &cmd[5];
        }

あと、ctrl O + I でエコー・バック・モードのトグル切り替えも選択します。これは maxima のときとは異なり必須ではありません。、どちらもでも gdb は動作します。でもエコー・バック・モードにしないと gdb コマンドが消えてしまいます。このほうが便利なときもあります。シングル・ステップでのデバッグ・トレースを行っているときは、gdb コマンドが消えてくれたほうが実行した行のみが繋がって表示されて便利です。Ctrl O + I:エコー・バック・モードのトグル切り替えを適宜切り替えて使っています。



●● さらなる改良 ●●

コンソールをどのように扱うかは、ユーザーによって千差万別です。最終的には、ユーザーごとに、使うアプリケーション・ソフトにあわせてカスタマイズする必要があると考えます。

craftlaunch, bluewind などのコマンドライン・ランチャのようにコンソールを扱う方向性もあります。でも現状のコマンド・ライン・ランチャーは kShell での機能と向かっている方向が違うと感じます。私自身は、kShell のコンソールで完結しているので、これらランチャーの詳細を知りません。でも、コマンド・ライン・ランチャーだけでは、kShell でのブロック実行・リンク実行のようなエディタ画面の文字列を切り出して実行させる発想は無いと思っています。一方でコマンドライン・ランチャを使うことで sf の別の実行のさせ方があるようにも思えます。詳しい方、挑戦願えますでしょうか。

多くのユーザー、多くのアプリケーションに適合するように kShell を拡張すべきです。そのときにはコマンド・ランチャーの発想も含まれるかもしれません。でも それらは私の能力を超えています。このような分野は GPL の精神の元に複数の人間による対策と拡張がなされていくべきものとも考えます。コンピュータに慣れた方たちにとっては便利な CUI の復活と新しい CUI 文化の構築が可能なはずです。GPL として公開する kShell がそのような切っ掛けになることを希望します。

以下、kShell を改良するとき知っておいたほうが良いと思うことを書いておきます。

● kShell に残っている問題点

私自身は プログラムのリンク start 起動を筆頭に、ブロック実行、sf 計算の順序で使っています。逆に、それ以外の機能は使い込んでいません。必要になったときに付け足したものにすぎません。幾つかの問題を残したままにしています。

△ コマンドの連続実行におけるエラー検出

ブロック実行において //@@@ に続けて記述してあるコマンドを実行していきます。このとき実行したコマンドがエラーを返しても次々とコマンドを実行してしまいます。copy /y コマンドを失敗することは殆ど無いこと、copy の次にコンパイルまたは実行させる程度の単純な連続実行ばかりの使い方なので、エラー検出をサボっています。

コマンド・エラーを検出できれば、ctrl O + Z でも連続してコマンドを実行させられるなど便利なのは判っています。そして shell.cpp に手を入れれば対策できるとも思っています。でも、これに手をつけると時間が取られすぎそうなので放置しています。

△ その他のコンソール・アプリケーションにおける不具合

kShell 上で多くのコンソール・アプリケーションが動きます。cygwin がインストールしてあれば ls や touch など unix コマンドも動きます。でも、入力を伴うコマンドで多くの問題が発生します。

Windows での date や time コマンドでは日付や時刻を入力にするために ">" を挿入する必要があります。

    >time
    現在の時刻: 12:04:08.82

Windows コンソールでは time コマンドに応答してコンピュータが出力する "現在の時刻: 12:04:08.82" の後ろに Enter を打ち込めなければ時刻を変更することなく time コマンド終わります。の操作で現在時刻を知ることができました。

でも kShell 上では "現在の時刻: 12:04:08.82" の後ろに Enter を入力すると "現在の時刻: 12:04:08.82" の文字列を time コマンドに渡してしまいます。

   time
   現在の時刻: 12:11:13.84
   新しい時刻を入力してください: 
   入力された時刻は受け付けられません。
   新しい時刻を入力してください: 
となってしまいます。"現在の時刻: 12:04:08.82"> + Enter と ">" を ">" を挿入してやる必要があります。

ftp コマンドなどもコンソール上で応答入力文字列が ftp.exe に渡せません。kShell 上で ftp.exe + Enter で ftp は起動するのですが、 open 以降の操作ができません。

python では、標準出力へのプリントを kShell に表示させるのが python 終了後になっています。文字列処理のように直ぐに処理が終わってしまうときは、これでも問題ありません。グラフィックを伴うとき、Tkl/Tk を使って Tk mainloop を回しながら、グラフィック表示制御と標準出力へのプリントを行うときは kShell ではなく Windows コンソールで動作させる必要があります。 start python test.py のように kShell とは別のコンソールで python を働かせます。

これらの問題点を対策するためには shell.cpp を修正する必要があります。また kShell.txc, BlockExe.txc が相互に組み合わさっている様子を理解しておくべきです。次の節でこの点について説明します。

● kShell マクロ全体構造

kShell を改良するためには、以下に説明する kShell マクロの全体の構造を知ったうえで、プログラム・ソースを追っていくと変更箇所・変更方法が見つけ易くなるはずです。

kShell は shell.cpp/kShell.txc(tx.txc)/BlockExe.txc 下の三つのプログラムの組み合わせで働いています

shell.cpp             kShell.txc(tx.txc)    BlockExe.txc
windows interface     Wz shell macro        application 側貼付け実行 Wzマクロ
                                            カーソルのある Wz エディタ行
                                            からコマンド文字列を抜き出し
                                            kShell.txc に引き渡す。

                                txstr* Extern_getTxstr(); 
                                    渡す文字列への shell 側のポインタを得る。
                                    このポインタ先にコマンド文字列を書き込む。
                                TX* pTxAt = Extern_getTX();
                                    マクロを実行させるための kShell のTX ポインタを得る
                                    上で得た kShell ポインタに
                                macroExec("ts.Extern_command",pTxAt);
                                    kShell.txc::Extern_command(.) マクロ関数を呼び出す

shell.cpp が Wz editor と Windows コンソールとの Wz エディタとの間で情報を遣り取りしています。この部分は熊谷氏が 作ったオリジナルのままです。変更を加えていません。この詳細な動きも理解していまません。

kShell.txc( 現在のところ tx.txc) が Wz editor 画面にコンソールの機能を与えています。キーボードの釦が操作されると kShell.txc::text_hook(.) が呼び出されて、押された釦が Enter のとき kShell.txc::exec_command(.) を実行します。kShell.txc::exec_command(.) はカーソル位置がある kShell 画面の文字列を読み取り Windows console コマンドとして実行します。

BlockExe.txc は Wz editor 画面からカーソルを置いてある行を読み出し kShell に貼り付けて kShell に実行させます。">" や ";;" デリミタ処理をしているのも BlockExe.txc です。Wz editor の txc 言語では BlockExe.txc モジュールから kShell.txc モジュールの機能を働かせるに、は下のように宣言した kShell.txc マクロ関数を呼び出します。また戻り値がないときは Wz 組み込み関数 macroExec(.) を使って macroExec("ts.Extern_command",pTxAt/*TX* */) のように kShell.txc 側のマクロを実行させます。

extern "ts"{ 
    txstr* Extern_getTxstr(); 
    TX* Extern_getTX();
} 

kShell::Extern_getTxstr() は txstr kShell.txc::strCmdGlb グローバル変数を返す kShell 関数です。Wz txc 言語ではグローバル関数は有ってもグローバル変数がないので、このようにします。またマクロ・モジュール間の関数呼び出しでは引数を渡せないので、このような迂遠なやりかたをしています。上手くすれば kShell::Extern_getTX() のような殆ど無意味な関数を省略できるかもしれません。現状でも動いているので、このままにしています。

また BlockExe.txc には //@@ から //@@@ の間の文字列の集まりをクリップ・ボードにコピーし c:\#####.### ファイルに書き出す BOOL selectAA(TX* text) 関数もあります。selectAA(.) は BOOL BlockExecute(TX* text): ctrl O + E から呼び出されています。

これらのkShell マクロの構造概要を前提に、ソースを追ってもらえば、改造の方法も読み取れると思います。たいしたことはしていませんから。


●● Emacs, Meadow、xyzzy の shell モード・マクロ開発依頼 ●●

kShell と同様なことを可能にする emacs lisp を作ってくれる方、emacs shell mode を改造し、lisp を公開しててくれる方を募集します。Ntemacs, xyzzy, Meadow, NTEmacs で下の仕様を満たす lisp を作った方は連絡ください。最初に作られた方には sf の無料登録をさせてもらいます。より高速な sf の非プロテクト版を送ります。その他でも sf のユニークな使い方をされている方は教えていただけますでしょうか。

要求仕様

コンソール・コマンド結果のコマンド文字列直後への挿入
emacs の shell モードは昔のダム端末で動作することを前提としています。キャラクタ・ウィンドウで上下に分割されたスプリット・ウィンドウで動作することを前提としています。このため shell プログラムが返す文字列は最下行書き足されていきます。kShell のように、shell 画面の途中にプログラム標準出力を挿入していけません。別の計算結果の近くに、新しい計算結果を挿入できません。これを可能にします。

コンソール・ウィンドウのオーバーラップ表示
emcas の shell モードはビットマップ上でのオーバーラップ・ウィンドウで動作することを前提としていません。複数の SDI 画面で動作することを想定していません。これも昔のダム端末を前提にしているためです。

現在の技術を前提にするならば、コンソール・ウィンドウは独立させるべきです。ながい sf 研鑚のときはオーバーラップ・ウィンドウの一部からバック・グラウンド動作の様子をのぞけるようにすべきです。これを可能にします。

sf 数式行、数式プロックの計算
上の二つを前提に、sf 式の計算行をエディタ上で可能にします。また sf ブロック式の計算を行います。すなわち //@@ と //@@@ で囲まれた sf 式ブロックを temp.se に変換し、sf.exe @@temp.se コマンドを実行し、標準出力結果をコンソール画面に出力します。

御意見、御要望、ソフトの登録は下のアドレスに連絡ください
    kenji□nasuinfo.or.jp
    kverifierlab□yahoo.co.jp
注意! □は @ に置き換えてください