検索後のカーソル位置No.04672
W.Hiroshi さん 05/04/24 22:16
 
いつもお世話になっております hiroshiです。

以前作ったマクロに、

「M06」を検索して直後に改行を挿入する ために
前略

gofiletop;
 while(1){searchdown "M06";
 if(result){right 3; insertreturn};
 else break};

後略

と言う部分がありましたが、今動かしてみた所、改行が挿入される位置が合いません。
(M06の二文字後ろに改行が入ります)
right 3;と言う部分が間違っているらしいことは分かるのですが、その当時はまとも
な動作をしていました。
と言うかその後何度かマクロを動かすたび(と言ってもそんなに頻繁に使っていたわ
けではないので数ヶ月おきぐらいに)改行位置がずれてしまって、その都度 right
 の後に数字を入れたり消したりしてその場をしのいできました。

searchdown 文の後のカーソル位置、その後の right(left) 文によるカーソルの
動きは何か条件によって変わるのでしょうか。
条件によって変わるとすれば、マクロ実行時必ず同じにするにはどうすればいいので
しょうか。

[ ]
RE:04672 検索後のカーソル位置No.04673
山紫水明 さん 05/04/24 23:06
 
 W.Hiroshiさん,こんばんは。

>searchdown 文の後のカーソル位置、その後の right(left) 文によるカーソ
>ルの動きは何か条件によって変わるのでしょうか。

 検索での表示が「点滅」か「範囲選択」かで変わるようです。

>条件によって変わるとすれば、マクロ実行時必ず同じにするにはどうすればい
>いのでしょうか。

1)searchmode で「点滅」か「範囲選択」を調べて動作を分ける。
2)replaceall "M06", "M06\\n", regular; にする。

などが考えられます。

     では, (^^)/~
                                        山紫水明(ユーザー)
                                        SANSHISUIMEI

[ ]
RE:04673 検索後のカーソル位置No.04674
W.Hiroshi さん 05/04/25 15:05
 
 山紫水明さんこんにちは W.Hiroshiです。

> 検索での表示が「点滅」か「範囲選択」かで変わるようです。

ここの設定は今まで意識的に設定したことがありませんでした。
設定を変更することによってどんなメリットがあるのか理解できなかったからです。
(今でもよく分かっていません)

バージョンアップした時に設定項目の内容などを見ていて無意識のうちに設定を変え
てしまったかな、

普段の使用には、「点滅」か「範囲選択」かどちらでも不都合はないので、たまたま
何らかの理由で設定が変わってしまっていても気づかないのですが、マクロの実行結
果が変わってしまうのは都合が悪いです。

マクロの中で、強制的に設定を変更してしまうことは出来るのでしょうか。

[ ]
RE:04674 検索後のカーソル位置No.04675
山紫水明 さん 05/04/25 21:18
 
 W.Hiroshiさん,こんばんは。

>設定を変更することによってどんなメリットがあるのか理解できなかったから
>です。(今でもよく分かっていません)

 どちらがいいかは好みの問題でしょうが,たとえば,
searchdown "[0-9]+", regular
で下方検索したとき,範囲選択であれば,
gettext( seltopx, seltopy, selendx, selendy );
でヒットした文字列を取得できます。

>マクロの中で、強制的に設定を変更してしまうことは出来るのでしょうか。

 上記のような場合は次のようなサブルーチンを使って一時的に範囲選択に切り
替えてまた元に戻すということをやります。

Change_search:    //検索状態を変更
  if ( !searchmode ) {     // 点滅であれば範囲選択に変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound", 1;
    #modechanged = 1;
    envchanged;
  }
  return;

Reset_search:   //検索状態を変更していれば元に戻す
  if ( #modechanged ) {
    writeregnum "SelectFound", 0;
    envchanged;
    closereg;
  }
  return;

     では, (^^)/~
                                        山紫水明
                                        SANSHISUIMEI

[ ]
RE:04674 検索後のカーソル位置No.04676
アルビレオ さん 05/04/25 21:49
 
秀丸ユーザーのアルビレオです。

>普段の使用には、「点滅」か「範囲選択」かどちらでも不都合はないので、たまたま
>何らかの理由で設定が変わってしまっていても気づかないのですが、マクロの実行結
>果が変わってしまうのは都合が悪いです。
>
>マクロの中で、強制的に設定を変更してしまうことは出来るのでしょうか。

大雑把な説明でよければマクロヘルプのenvchangedのところにあります。
基本的には

○マクロ開始時
1. searchmodeで現在の状態を調べる
2. 状態を変更したければwriteregnum→envchangedで変更

○マクロ終了時
1. 状態を変更していればwriteregnum→envchangedで元に戻す

となりますが、この方法ではマクロの途中でエラーが出たり強制中断したときに
元に戻されないままになります。

だから可能ならば山紫水明さんが1)で書かれているように、設定自体は変更せ
ずにそれぞれの状態での動作を用意して、切り替えるのがベターですね。
(レジストリキー調べるのもめんどうだし)

[ ]
RE:04675 検索後のカーソル位置No.04677
W.Hiroshi さん 05/04/26 16:56
 
山紫水明さんこんにちは

>で下方検索したとき,範囲選択であれば,
>gettext( seltopx, seltopy, selendx, selendy );
>でヒットした文字列を取得できます。

なるほど、こうすれば文字列が何文字になるか分からなくても一度に取得できるわけ
ですね。

> 上記のような場合は次のようなサブルーチンを使って一時的に範囲選択に切り
>替えてまた元に戻すということをやります。

たいへん参考になりました、今後必要に応じ使わせていただきたいと思います。
ありがとうございました。


[ ]
RE:04676 検索後のカーソル位置No.04678
W.Hiroshi さん 05/04/26 21:36
 
アルビレオさんこんにちは

>大雑把な説明でよければマクロヘルプのenvchangedのところにあります。

レジストリというものをよく理解していないので、マクロからレジストリにアクセス
しようなどとは思いもしませんでした。

>となりますが、この方法ではマクロの途中でエラーが出たり強制中断したときに
>元に戻されないままになります。

元々どちらに設定されていたか気づかなかったくらいなので、今現在の使用環境では、
元に戻らなくても不都合はないのですが

山紫水明さんからレジストリを変更する方法も教えていただきましたので必要に応じ
ベストな方法を使い分けられるようにしたいと思います。

[ ]