|
こんにちは。
movetolineno文の動作で改良後、気の付いたことを報告します。
1) 禁則処理で次行に追い出されている文字の頭に movetolinenoでカー
ソル移動すると、正規の位置にはカーソルが移動しない。その結果、
movetolineno後 right文などが期待する働きをしない。
1本の行のカーソル地点より後方を編集し、再びカーソルを元の位置
に戻すような処理では、禁則処理によりテキストのレイアウトが変わ
る恐れがあるので moveto文より movetolineno文を使う方が望ましい
が、このバグがあるので処理方法を工夫しなくてはいけない。
2) コマンドの改定が行われる前の動作では、固定ピッチフォントで全角
表示される2Byte文字の中央に movetolinenoすると、文字の右に寄っ
たが、改定後は左に寄る。
指定 column位置に+1されていたのが−1されるようになった。
その結果、カーソル位置を決め打ちする段落整形マクロなど、従来か
ら使われている物のいくつかが誤動作するようになった。
movetoコマンドでは以前のバージョンでもこの動作なのでこちらに合
わせたのかもしれない。
・項目1のチェックマクロ
禁則処理を入れて、折り返し幅 80にてテストしてください。
私の端末では、※1は“80 >< 80”※2は“80 >(< 81”となります。
newfile;
#i = 80; while( 0 < #i ) { #i = #i - 1; insert "O"; }
insert "(";
movetolineno 80 + 1,lineno; // ※1
#c = column; beginsel; right; #d = column;
message str( #c ) + " >" + gettext( seltopx, seltopy, selendx, selendy )
+ "< " + str( #d );
golinetop2; right 80; // ※2
#c = column; beginsel; right; #d = column;
message str( #c ) + " >" + gettext( seltopx, seltopy, selendx, selendy )
+ "< " + str( #d );
対策。
項目1、項目2、及び以前のバージョンのバグ、見掛け上の1行に収
まらない行の中間にタブか使われている場合、追い出された文字のあ
とにタブがある場合、プロポーショナルフォントで表示している場合
の movetolineno文の誤動作をどう防ぐか。
私の場合、誤動作するマクロの movetolineno文を“call movetolineno”
に書き換えて、以下のサブルーチンをかましています。あんまりきれいな
ルーチンじゃない & どんな場合でもちゃんと動くか分からない、のです
けれども。
movetolineno: // tabのある行での movetolinenoのバグ対策
// ※ あらかじめ“カーソルが tab文字を貫通する”設定は外すこと
##c = ##1; if( ##c < 1 ) ##c = 1;
movetolineno ##c, ##2;
if( linelen == x && ( ! return ) ) {
moveto 0, y + 1;
}
##c = ##c - 1; if( linelen2 < ##c ) ##c = linelen2;
##d = column - ##c; ##f = ( 0 < ##d ) * 2 - 1;
while( ##f == ( ( 0 < ##d ) * 2 - 1 ) * ( 0 != ##d ) ) {
##a = ( ##d * ##f + 1 ) / 2;
if( 0 < ##f ) {
left ##a;
} else if( linelen == x && ( ! return ) ) {
moveto 0, y + 1;
// ver3.08 での禁則ぶら下げ文字がらみのbug対策
} else {
right ##a;
}
##d = column - ##c;
}
if( ##d < 0 ) {
if( linelen == x && ( ! return ) ) {
moveto 0, y + 1;
} else {
right;
}
##d = column - ##c;
}
if( lineno != ##2 || ##d < 0 || 1 < ##d ) {
message "error: movetolineno";
// goto main_end; // マクロの後始末
endmacroall;
}
return;
|
|