|
お世話になっております。
自動起動マクロ(カーソル移動後タイマー)に登録したマクロで、入力した方向キー
によってbeginselとbeginlineselを切り替えるものを作っているます。
通常のマクロではbeginlineselを呼び出した時のカーソル行も選択範囲内に入るので
すが、カーソル移動後タイマーで呼び出したときに、カーソルのある行が選択範囲に
入らない現象が出ていてご相談させていただきました。
具体的には、別のマクロで選択開始時のカーソル位置を記憶させておいて、カーソル
移動後タイマーの中では上下キーだった場合は、カーソル位置を記憶した後、moveto
で初期位置に戻してbeginlineselを呼んだ後で、またカーソルを戻すような事をして
います。
このとき、下を押した場合は初期位置より1行下からが選択された状態になってしま
します。
このとき、上を押した場合は初期位置より1行上からが選択された状態になってしま
します。
左右でbeginselに切り替える様にしているのですが、こちらは特に問題なく動作して
います。
自動起動マクロなので、内部の処理順番とかが関係しそうな気がしているのですが、
これは仕様でしょうか?
現在8.00β26で試しています。
よろしくお願いします。
-------自動起動マクロ-----------------------------------------------
main:
if(selecting && rectselecting==0){
disabledraw;
disablebreak;
// 選択開始時のカーソル位置
$sx = getstaticvariable("sx");
$sy = getstaticvariable("sy");
$sm = getstaticvariable("sm");
#org_x = val($sx);
#org_y = val($sy);
#mode = val($sm);
// 現在のカーソル位置
#now_x = x;
#now_y = y;
// UP
if(iskeydown(0x26)){
if(#mode!=1) call change_to_line;
#new_mode = 1;
}
// DOWN
else if(iskeydown(0x28)){
if(#mode!=1) call change_to_line;
#new_mode = 1;
}
// LEFT
else if(iskeydown(0x25)){
if(#mode!=0) call change_to_char;
#new_mode = 0;
}
// RIGHT
else if(iskeydown(0x27)){
if(#mode!=0) call change_to_char;
#new_mode = 0;
}
// 選択モードの更新
if(#new_mode != #mode){
setstaticvariable "sm", str(#new_mode), 0;
}
enabledraw;
}
endmacro;
// 選択開始位置に戻って、改めて行選択を開始する。
// その後、カーソル位置を戻す
change_to_line:
moveto #org_x, #org_y; // <== ★★★★ ここの挙動がよくわからない ★★★★
beginlinesel;
moveto #now_x, #now_y;
return;
// 選択開始位置に戻って、改めて通常択を開始する
// その後、カーソル位置を戻す
change_to_char:
moveto #org_x, #org_y;
beginsel;
moveto #now_x, #now_y;
return;
--------選択開始マクロ---------------------------------------------------------
main:
#start_mode = 0; // 0:通常選択 1:行選択
if( selecting || rectselecting){
// 選択中なら、選択解除
escape;
} else {
// 初期カーソル位置を記憶
setstaticvariable "sx", str(x), 0;
setstaticvariable "sy", str(y), 0;
// 選択開始
if(#start_mode==0){
setstaticvariable "sm", "0", 0;
beginsel;
}
else{
setstaticvariable "sm", "1", 0;
beginlinesel;
}
}
endmacro;
|
|