===== Display-Macro ===== ; display-macro ... 格納されているマクロの状況を報告する. * M 64 ^\ "display-macro" ; ; 初期設定 ; vv[-, ; verbose mode (ks&3)?{vv+,} ; shift-alt-G でマクロの中身も見せる mm[-, gg[-, ll[-, pp[-, ; それぞれモジュール,グローバルマクロ,ローカルマクロ,メニューの数 n2, &65 ; テンポラリバッファを開く &66 b=r, ; ローカルバッファ q"$[64,$ff]", ; 特殊キーの名前の表 q..0="F01", q..1="F02", q..2="F03", q..3="F04", q..4="F05", q..5="F06", q..6="F07", q..7="F08", q..8="F09", q..9="F10", q..10="F11", q..11="F12", q..12="F13", q..13="F14", q..14="F15", q..15="PGDN", q..16="PGUP", q..17="INS", q..18="DEL", q..19="UP", q..20="<--", q..21="-->", q..22="DOWN", q..23="HOME", q..24="END", q..25="ESC", q..26="TAB", q..27="BS", q..28="CR", q..29="NFER", &s ; silent mode ; p=mg..1,>D ; これをコメントアウトすると自分自身のみ表示 p=mh, ; 先頭のモジュールヘッダへのポインタ ; ; モジュールヘッダ ; :H (p==mg..1)?{t"Me,",}?{t"",} ; mg..1 は自分自身のモジュールヘッダへのポインタをさしている :D m=p.0, ; モジュールヘッダ番号 l=(p+1)..0, ; モジュールヘッダのサイズ f=(p+3).0, ; モジュールフラグ h=(p+4)..0, ; 次のモジュールヘッダへのポインタ i=(p+6)..0, ; モジュール ID の長さ p+=8, ; モジュール ID j=0, :I b.j=p.0, j++, p++, i--, (i>0)?>I ; モジュール ID のコピー ; (&? では最後に NULL が必要なもんで) b.j=0, p++, n=p, ; モジュールの名前 &Sn(p) p+=(r+1), &?("Module %s [%sID=$"%s$",Flag=", n, t, b) (f==0)?{"None"}?{ c="", (f&$01)?{&?("%sSleep", c) c="+",} (f&$02)?{&?("%sRemovable", c) c="+",} (f&$04)?{&?("%sExternal", c) c="+",} (f&$80)?{&?("%sKeyboardMacro", c) c="+",} } "]" #m mm++, ; ; マクロ (グローバル,ローカル,およびメニュー) ; :M m=p.0, ; マクロ番号 l=(p+1)..0, ; マクロのサイズ (m>=$80&&m<=$e0)?>L ; ローカルマクロ (m>=$e1&&m<=$ff)?>P ; メニュー ; ; グローバルマクロ ; x=(p+3).0, ; マクロキー (1) y=(p+4).0, ; マクロキー (2) p+=5, n=p, ; マクロの名前 &Sn(p) k=r+1, p+=k, &?("Macro %d $"%s$" [Size=%d,Key=", m, n, l) (x&y==$ff)?{"Undefined"}?{ (x!=$ff)?{a=x, &> &?("%s", b)} (x!=$ff&&y!=$ff)?{";"} (y!=$ff)?{a=y, &> &?("%s", b)} } "]" #m n=l-(k+2), (vv)?&01 p+=n, gg++, >E ; ; ローカルマクロ ; :L p+=3, (vv)?{&?("Local %d [Size=%d]", m-$80, l) #m} n=l, (vv)?&01 p+=n, ll++, >E ; ; メニュー ; :P w=p.3, ; メニュー表示幅 x=p.4, ; メニューアイテム個数 i=p.5, ; メニューパラメタ (1) j=p.6, ; メニューパラメタ (2) p+=7, &?("Menu %d $"%s$" [Size=%d,Width=%d,Items=%d,Parameter=%d;%d]", m-$e0, p+((x+1)*2), l, w, x, i, j) #m n=l-4, (vv)?&02 p+=n, pp++, :E (p.0)??>Q ; もう最後だったら終わりに飛ぶ (あたりまえだ) &m("%d modules, %d macros, %d locals, and %d menus are found", mm, gg, ll, pp) ; これは毎回表示する (p.0!=$ff)?>M{#m>H} ; $ff はモジュール最後尾の印なので次のモジュールへ ; それ以外なら次のマクロへ :Q #m &?("%d 個のモジュールがありました.", mm) #m &?("%d 個のグローバルマクロがありました.", gg) #m &?("%d 個のローカルマクロがありました.", ll) #m &?("%d 個のポップアップメニューがありました.", pp) #m n1, &65 ; テンポラリをびゅーモードにする &d ; display mode pp], ll], gg], mm], vv], . 0: ; マクロキーの表示 (a>=$00&&a<=$1f)?{&Sp(b,"Ctrl-%c", a+'@').} (a>=$20&&a<=$3f)?{&Sp(b,"Alt-%c", a+'@'-$20).} (a>=$40&&a<=$5f)?{&Sp(b,"Prefix1-%c", a+'@'-$40).} (a>=$60&&a<=$7f)?{&Sp(b,"Prefix2-%c", a+'@'-$60).} (a>=$80&&a<=$9f)?{&Sp(b,"%s", q..(a-$81)).} (a>=$a0&&a<=$bf)?{&Sp(b,"Shift-%s", q..(a-$a1)).} (a>=$c0&&a<=$df)?{&Sp(b,"Ctrl-%s", q..(a-$c1)).} (a>=$e0&&a<=$fe)?{&Sp(b,"Alt-%s", q..(a-$e1)).} &Sc(b,"Undefined"). 1: ; マクロの表示 (p から n バイト出力, b のバッファは破壊) Ei[-, i-, " " :L (i>=n)?>Q (lx>72)?{#m" "} ((p.i>=$81&&p.i<=$9f)||(p.i>=$e0&&m.0<=$fc))?{b.0=p.i,b.1=p.(i+1),b.2=0,&?("%s",b)i++,i++,>L} ; 漢字 (p.i>=$80&&p.i<=$ff)?{&?("$$%x", p.i)i++,>L} ; その他 8 ビット文字 (p.i>=0&&p.i<$20)?{b.0='^',b.1=p.i+'@',b.2=0,&?("%s",b)i++,>L} ; 制御文字 (^M など) b.0=p.i,b.1=0,&?("%s",b)i++,>L ; 上記以外 (英数字とか) :Q #m Ei],. 2: ; メニューアイテムの表示 (p から x 個のメニュー, b バッファは破壊) Ei-, n[, t[, t=p+((x+1)*2), &Sn(t) t+=(r+1), ; とりあえずメニュータイトル文字列をスキップ i1, :L n=p+i*2, (n.1==1)?>P ; メニュー (!nn) (n.1==2)?>C ; コマンド (#nn) (n.1==4)?>M ; マクロ (&nn) (n.1==$80)?>O ; オプション (xx) &Sc(b, "NoFunction")>N ; 上記以外 (機能無指定) :P &Sp(b, "Menu %d", n.0)>N :C &Sp(b, "Command %d", n.0)>N :M &Sp(b, "Macro %d", n.0)>N :O &Sp(b, "Option %d", n.0)>N :N &?(" %s $"%s$"", b, t) #m &Sn(t) t+=(r+1), i++, (i<=x)?>L t], n], Ei],. ; ; Primitive Functions ; 65 "change-to-temporary-buffer" ; ; Emacs のテンポラリ関係のバッファみたいに開く ; ; Input ... n=0 ... 開いて書き込み許可 ; ... n=1 ... 現在のバッファを書き込み禁止するだけ (手抜き) ; ... n=2 ... 開いて全消去後書き込み許可 ; Output ... r=テンポラリバッファのテキスト番号 ; &66 の文字列バッファは破壊 &s (n-1)??{mr$80,#W>Q} &#Y(0) b[=wn, &66 pf[=r, Sn[-, #O &?("%svztmpbuf.$$$$$$",pi) #m Sn], pf], mr-, (n-2)??{mb-, ux[+, #^ #b #_ #y ux], mr-,} #_ t[=wn, &#T(b) ; wn==b &#Y(2) ; wn==b #W ; wn==not b &#T(t) ; wn==t t], b], :Q &d #] (wn). 66 "local-buffer" ; ; 単なるローカルバッファ ; ; Input ... なし ; Output ... r=バッファの先頭へのポインタ (5+$)."$(80,0)$[256]" * Reference 兵藤嘉彦, 1993. VZ Editor Version 1.6 ユーザーズマニュアル. ビレッジセンター. 上村郁夫 (編), 1993. VZ マクロ道場. 秀和システムトレーディング株式会社. // とりわけシステム関数とポインタの使い方でとても // 参考になった.とくに上の 66 番にある定型句なんて // みんな使っているけど自分では思いもつかない (^^;) // この本に比べてその前に読んだ某256倍本はほとんど // 役に立たなかった ... 広瀬雄二, 1993a. autoload.def v1.11. // 広瀬 (1993b) に付属していたコンパクトな外部ローダで, // 細かい芸を磨く参考になった. 広瀬雄二, 1993b. Emacs.def v0.05. // これを改造することが Vz マクロに手を出すきっかけになった.