自動起動マクロ中のbeginlineselの挙動にNo.04559
tubo さん 09/11/24 19:19
 
お世話になっております。

自動起動マクロ(カーソル移動後タイマー)に登録したマクロで、入力した方向キー
によって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;

[ ]
RE:04559 自動起動マクロ中のbeginlineselNo.04566
秀丸担当 さん 09/11/25 11:48
 

>通常のマクロではbeginlineselを呼び出した時のカーソル行も選択範囲内に入るので
>すが、カーソル移動後タイマーで呼び出したときに、カーソルのある行が選択範囲に
>入らない現象が出ていてご相談させていただきました。

報告ありがとうございます。
マクロの通りにしてみて確認することができました。

beginlinesel;
moveto 0,y+3;
endmacro;

というようなマクロだけでも問題部分を再現できました。
行選択開始コマンドの後は、カーソル上下キーで行選択の拡張の対応があっただ
けで、movetoで直接座標へ移動した場合は行選択が働いていませんでした。
movetoの後は通常の選択として扱われ、最初の行の行末から移動先までの選択に
なっていました。
movetoの場合も行選択を維持したほうがいいので、β27で修正させていただきま
す。

[ ]
RE:04566 自動起動マクロ中のbeginlineselNo.04583
tubo さん 09/11/26 00:38
 
>beginlinesel;
>moveto 0,y+3;
>endmacro;

beginlineselの前ではなくて、後ろのmovetoが原因だったのですね。

>movetoの場合も行選択を維持したほうがいいので、β27で修正させていただきま
>す。

助かります。
よろしくお願いいたします。

[ ]