番号 | 記号 | 初期キー | 機能 |
---|---|---|---|
#28 | - | - | 未定義 |
未定義コマンド。ラインバッファに入る機能だけがある。
カーソル行をラインバッファに入れるという働きは,#04〜#28 に共通した機能である。#04〜#25は行編集機能があるコマンドだが,#26〜#28 は副作用のないダミーコマンドと言える。cpがラインバッファの中を指すようになるので,メモリ上でcpをポインタとして使用し,行内の離れた位置にある文字・文字列を直接操作できるようになる。
ビューモード(mr==$80)では使用できないが,再表示せずにカーソルをラインバッファに入れるので,再表示を伴うがビューモードでも有効な#29(#?)との使い分けをする。
コマンド | サイレントモード | ビューモード |
---|---|---|
#28 | 変更しない | 無効 |
#29(#?) | オフにして再表示 | 有効 |
戻り値 r:0=行編集開始, -1=ラインバッファがいっぱい
編集モードと同じ
編集モードと同じ
無効
無効
キーが与えられていないダミーコマンドであるため,拡張ではなく利用例を示す。
28 ^\ "" ;cord ++/\-- ;Emmett ?. #28 &Jk(cp.) cp.r+=1-ks&1*2, #?
Emmett氏の見事な一行野郎である。解説を加えておこう。
?. | 編集モード以外では実行しない |
#28 | ラインバッファに入る cpがラインバッファのオフセットを示すようになる |
&Jk(cp.) | &Jk(cp.0)と等価 カーソル位置の1バイトが漢字(2バイト文字)の1バイト目かどうか判定している 戻り値rが1なら漢字(2バイト文字) r==0なら英数字(ASCII) |
cp.r+=1-ks&1*2, | 左辺は値を操作する相対アドレス ASCIIならcp.0 漢字ならcp.1になる 漢字コード2バイト目を増減するとコード順どおりに変更できる 2バイトをセットで値として扱うと下位バイトの1バイト目を加減することになるのでコード順どおりにならない 右辺は通常1(1-0*2)になり左辺の値をインクリメントすることになる シフト実行すると右辺は-1(1-1*2)になり左辺の値をデクリメントすることになる |
#? | 再表示する cpをいじったら#29(#?)で再表示する 理由は&dよりも速度で有利だからだ |
説明ならこれで済んでしまうが,この考え抜かれたコードの見事さはどうだろう。特別に難解なコードというわけではないが,組立てが絶妙で無駄がない。しかも足りないものもない。完璧といってよい小物の見本のようなマクロだ。