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 マクロは、MS Windows でのコンソール環境を使いやすくするものです。コンソールでの文字列処理を Wz エディタでの文字列処理と同様に行えるようにしています。昔の Vz エディタのコンソール・モードのような使い方を想定しています。
また、コンソールとは別のエディタ画面上にある sf 数式やコンソール・コマンドなどを貼り付けて実行する機能も組み込んであります。さらには //@@ から //@@@ の範囲の文字列ブロックをコンパイルすることも可能にしました。
kShell は、コマンド・ライン電卓ソフト sf を使った計算操作を容易にすることに一番の力を注ぎました。これ以上の sf を使いやすくする方法は殆ど残っていないと考えます。一方で GDB デバッガとの組み合わせ利用については改良の余地が多く残っています。kShell を皆様にも改良していただくことを望んでいます。
kShell, BlockExe Wz マクロを使うことで、Windows の操作環境が大きく変わります。マウスの使用頻度を極限にまで少なくできます。是非ともお試しください。
//コンソール貼付け実行マクロ 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
//「マクロの実行」のダイアログ・ウィンドウを出します alt + T ==> X // "ts" を指定して kShell WZ 画面を出させます
私は 「\a.bat」 に下のような Wz を立ち上げるコマンドを書いておき、「スタート」 ==> 「ファイル名を指定して実行」の 「\a」を実行させます。その後に上の "alt+T" 以下の操作を行って kShell 画面を作っています
type \a.bat start \utl\wz4\wzeditor.exe \job\vrfy\doc\exprt\sf.htm
本当は、「\a.bat」に kShell マクロを立ち上げるコマンドを書いておきたいのですが、その方法が見つかりません。うまい方法があるときは教えていただけますでしょうか。
スタート ==> ファイル名を指定して実行 ==> ダイアログ画面で "cmd" 文字列と Enter を打ち込む
同様なことが kShell 画面上で "start cmd" と打ち込むだけで実行できます。こっちのほうが簡単でしょう。
どちらで、立ち上げるにせよ、kShell とは別なプロセスとして、コンソールが立ち上がっています。kShell など他の処理と平行して、コンソール内で別のプログラムを実行させられます。chkdsk や xcopy バック・アップなどの時間のかかる処理は、kShell とは別にコンソールを立ち上げて、そこで実行させたほうが効率的です。
cmd 画面と 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 と同じキー操作で可能です。
でも、カーソル・キーを操作するにはホーム・ポジションを崩さねばなりません。kShell では ctrl + 0/9 にも、コマンド履歴を表示する機能を割り振ってあります。ホーム・ポジションを崩さずに済ませられるようにしてあります。( なお ctrl+0/9 は ts.txc に hard cording してあります。kShell ウィンドウがアクティブのときのみ有効です。)
コマンド履歴で戻した文字列は、一部分を編集し直してからコマンドを実行されることも多くあります。
Windows コンソールのときは ←/→キーでカーソルを移動し、delete/Back space キーで文字を消し、文字の挿入または上書きによつてコマンドを編集できます。これらの操作もホーム・ポジションを保てません。kShell なはらば、エディタの文字列編集操作がそのまま使えます。Emacs の shell モードも同じです。
Emacs shell・モードでも同様に画面にあるコマンド文字列を実行できますができます。でも実行するときに最下行にカーソルを移してしまいます。kShell でのように、操作カーソル位置に実行結果を挿入するほうが多くの場合便利です。
二次元平面でのコマンド実行は、複雑なコンピュータ操作をより簡単にしてくれます。
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 の挿入作業も省略できます。
先にも述べましたが 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
デリミタ文字列を二種類 ";;",">" 用意してあるのは、編集しているエディタ行によっては、既に ">" 文字が使われていることがあるためです。";;" が使われることは非常に少ないからです。
デリミタ文字列によりコマンド行の切り出しは次のような優先順位で行われます
この ctrl O + F マクロは Wz エディタの任意のテキスト行にリンクを貼れることを意味します。Word ファイル、GIF 画像ファイル、URL アドレスや wave ファイルなど Widnows で関連付けられている任意のファイルをリンクできます。関連付けられていなファイルでも、対応する実行ファイルを一緒に書いてやることでリンクできます。
たとえばプログラムのコメントに、このリンクが使えます。プログラムのコメント中には書きにくい図形などを使った詳細説明をコメント部分にリンクしておけば、それを何時でも ctrl O + F で参照できます。リンク先を URL にしておけば、リンク先のアンカー位置まで指定することも可能です。
ただし for(;;){...} のように無限ループを記述行ではリンク start 実行を行わないでください。";;" デリミタ文字列が for 文の中にあるからです。そのときは for (;;) 文がない行に start 実行によるリンクを書いてやってください。
ブロック実行マクロでは //@@ または 行頭から //@@@ の範囲までを括り出して 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 #include0019 #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
このプロック実効マクロは見た目以上に便利です。特に上に例示したような小さなテスト・プログラムを大量に作っていくときに下のような理由で便利です。お試しください
start http://www.google.com/intl/ja/この BlockExe.txc にある "start http://www.google.com/intl/ja/" 文字列を別のコマンド文字列に変更できます。任意のソフトを開始させられるようになります。Wz マクロを弄れる方は、御自分がよく使うソフトに修正してみてください。
# 計算ノート側のエディタに書いてある 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 にはテキスト・ファイルに書かれた一連の 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 の計算を容易にすることを一番の目標に作りました。
sf のときと同様に python スクリプト・ブロックを kShell に実行させられます copy \#####.### temp.py と python temp.py の実行を自動的に wz マクロから行わせます。それを実行するクロ側が BlockExe.PyBlockExecute: ctrl O + P マクロです。
Python の namarray などを使うことで可能な数値計算処理の範囲が広がります。sf から python ルーチンを呼び出せます。
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 自体のインストールは簡単です。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 はエコー・バック・モードに入ると、行頭の "(Cn)" 文字列を除いた maxima 数式文字列を shell 即ち maxima.exe に送ります。エコー・バック・モードでないと "(Cn)" も含めた数式を maxima.exe に送ってしまいます。Maxima.exe は "(Cn)" 数式処理文字列は異常であるとみなしてエラーにしてしまいます。
#計算ノート側のエディタに書いてある 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 上でも動作します。さらに 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 を改良するとき知っておいたほうが良いと思うことを書いておきます。
私自身は プログラムのリンク 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 は 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 マクロの構造概要を前提に、ソースを追ってもらえば、改造の方法も読み取れると思います。たいしたことはしていませんから。
kShell と同様なことを可能にする emacs lisp を作ってくれる方、emacs shell mode を改造し、lisp を公開しててくれる方を募集します。Ntemacs, xyzzy, Meadow, NTEmacs で下の仕様を満たす lisp を作った方は連絡ください。最初に作られた方には sf の無料登録をさせてもらいます。より高速な sf の非プロテクト版を送ります。その他でも sf のユニークな使い方をされている方は教えていただけますでしょうか。
要求仕様
kenji□nasuinfo.or.jp kverifierlab□yahoo.co.jp 注意! □は @ に置き換えてください