ks(シフトキーフラグ)は,どのシフトキーが押されているかがリアルタイムで反映されている変数です。この変数が使われる場面は,マクロ起動時の条件分岐だけでありません。例えば,[CR]で応答したか,あるいは^Mで応答したかというような,コマンドキーを使い分けられる場面でも有効ですし,繰り返し処理を中断するという場面でも使える非常に有用な変数です。
(-1){ #d (ks&1||r)?{}} ;シフトキーが押されるか突当たりまで移動
ksはシフトキーが押されているその瞬間だけ値が反映されますので,値が保存されません。任意の時点で値を参照するのであれば,マクロの冒頭などシフトキーが押されることを期待するところで,別の変数に値を保存しなければなりません。
k=ks&1, ;== k1&ks, ;(A)
;; ---- 共通処理 ----
(k)??. ;(A)でシフトキーが押されていなかったら終了
;; ---- シフトキーが押されていたときの追加処理
起動時に分岐したいような場合でも,マクロがロードされて実行が始まる前にシフトキーから手が離れてしまうかもしれません。起動時にシフトキーを押すことによって分岐する手法は「シフト起動」と呼ばれており,このような起動方法が期待されている場合は,シフトキーを長押しすると失敗が少ないでしょう。
53 ^KS "TAB<=>SPC[\]" ;Ikuo ;[\] H_ear ?. (ks&1)?r32, ?r9, >> 1: &s mp[, ps[=pa, #F &o(r) #m ; タブか半角スペースを検索する ; ---- 以下略 ----
51 [ESC]B "sort block[\]" ;Ikuo ;[\] /r, [lx] /+(lx+1) ?. (mr==$80)?. (mb)??. &s k=ks&1, x=lx+1, ;ss2, #S "temp.src" #m (s)?'Y' #E "SORT" (k)?" /r" &?(" /+%d <temp.src >temp.dst",x) #m #[ ; ---- 以下略 ----
シフト起動は,キーを節約でき,同種の処理,あるいは相対する処理を上手に使い分けるのにとても役に立ちます。
問題点は,IBM系とNEC系の違いなど,キーボードの仕様で値が大きく異なっていたり,あるいは存在しなかったりすることで,条件判断の式が難しくなることです。さらに,[CAPS]や[カナ]などのロック系シフトキーの存在によって,キーボードに触れていないからといってksの値がゼロであるとは限らないということも無視できません。
そこで,ksの値をリアルタイムで確認できる榊原院長の「ks見る」を試してみることをお勧めします。[ESC]を押せば終了します。
=== ksmiru by tomo * m 1 "ksを見る";システム変数 ks の変化を見る ?. :A a=ks, (i8){pu.i--='1'-(a&1<<(7-i))!, };ビット表示 &m("ks= %3d $%02x %8s",a,a,pu) :B (a-ks)?>A; &k (r-$1B)?>B ;ESCが押されてない? &m("終了") *
変数rは返り値(result)を一時的に記録しておく特殊な変数です。返り値はコマンドやマクロ,あるいはメニューから発行され,実行しようとした機能が正常に実行されたかどうかを判定するために必要な,とても重要な変数です。
正常終了・異常終了の場合のそれぞれの後処理を分岐させなければならないときなど,rを参照しなければならないケースというのは,マクロが高度になればなるほど増えていきます。
変数rは色々な場面で変化していきますので,返り値として確認する場合は値が格納された直後でなければなりません。確認用メッセージの表示に使用できる&m()
関数やメッセージを一定のあいだ表示させておくために使用できる&w()
関数はrを保存してくれます。これらの関数を値を確認したい部分に仕込むことにより,デバッグ作業を能率的に行うことができます。
; ---- 何かの処理 ----
&m("Result: %d %u $%x '%c' $"%16s$"",r,r,r,r,r) ;色々な数値に対応
&w(180) ;三秒間表示させておく
なお,編集操作中にrの変化を確認したい場合は,次項を参照してください。
すべての変数の値をリアルタイムに確認することは到底無理な話ですが,テキストの編集中にいくつかの変数の値を確認できる見米快之氏のマクロを一度試してみてください。
もちろん,変数の設定を変更すれば別の変数についても確認が可能です。特筆すべきところは,編集コマンドの返り値もリアルタイムで確認できるという点です。[ESC]を押せば終了します。
1 ^\ "" ?. a-, :A pm="%3d cd=%04xh ct=%d lx=%2d lh=%2d sm=%d cm=%2d $ wc=%d cp=%04xh cl=%04xh xc=%2d Count=%d", &m(pm,r,cd,ct,lx,lh,sm,cm,wc,cp,cl,xc,a) ep[+, &p ep], (s||r-#[)?{ &o(r) (ct>2)?a++, >A } &m("")