全置換のやり直しがAlt-Aで全置換した場合No.25931
緒方聡 さん 08/12/26 08:15
 
報告します。

【環境】
秀丸エディタ 7.10

【問題点】
全置換のやりなおしが「まとめて」になっているのに
ひとつずつしかやり直せない

【手順】
1. 動作環境 ⇒ 編集 より、全置換のやり直しを「まとめて」にする
2. 置換ダイアログで適当に置換設定し、Alt-A で全置換する
3. Ctrl-Z でやり直してみる

【問題点】
ひとつずつしかやり直されない

【期待する動作】
まとめてやり直される

【補足】
置換ダイアログで Alt-A ではなく、全置換ボタンをクリックすると
まとめて置換できる

[ ]
RE:25931 全置換のやり直しがAlt-Aで全置No.25935
秀丸担当 さん 08/12/26 10:39
 

>【補足】
>置換ダイアログで Alt-A ではなく、全置換ボタンをクリックすると
>まとめて置換できる

試してみましたが、Alt-Aと全置換ボタンクリックでは動作に違いは見られませ
んでした。

[その他]→[動作環境]→[パフォーマンス]→[詳細]→[やり直しバッファサイズ]
が関係しているかもしれないと思いましたが、バッファが小さくても、途中まで
のやり直しになるだけなので関係ないかもしれません。
もしバッファが小さい場合、大きくしてみるとどうでしょうか。

「置換の前に確認」がONになっていて、下候補した後の一気(Alt-A)では、全
置換にはならず、最初にヒットしたもの以降の置換になります。そのようなこと
が関係しているとか。「置換の前に確認」がONの場合はOFFにしてみるとかはど
うでしょうか。

もしAlt-Aと全置換ボタンクリックしたときで、テキスト内容や置換個数などに
少しでも違いがある場合は別の原因かもしれないので、全く同じ条件で試してい
ただけると何か分かるかもしれません。

[ ]
RE:25935 全置換のやり直しがAlt-Aで全置No.25936
緒方聡 さん 08/12/26 15:28
 
再現条件が違いました。

マクロから置換ダイアログを出した場合、まとめてやり直しができません。
メニューから置換ダイアログを出した場合、まとめてやり直しができます。

念のため、以下に Ctrl-R に割り当てているマクロを貼っておきます。

----

loaddll "TKInfo.dll";
if (result) {
 #isHidemaruMail = true;
}

#searchoption = searchoption | 0x00000800; // 検索文字列の強調
#searchoption = #searchoption | 0x00000004; // 置換フラグをつける

#inselect = 0;

if (selecting) {
 if (seltoplineno != selendlineno) {
  setsearch searchbuffer, #searchoption;
  forceinselect 1;
  hilightfound 1;
  find2;
 } else {
  $text = gettext(seltopx, seltopy, selendx, selendy, 1);
  setsearch $text, #searchoption;
  hilightfound 1;
  find2;
 }
} else if (code == '\r' || code == '\n' || code == '\t' || code == ' ' || co
de == eof) {
 setsearch "", #searchoption;
 find2;
} else {
 #x = x;
 #y = y;
 gowordtop;
 #sx = x;
 #sy = y;
 gowordend;
 #ex = x;
 #ey = y;
 moveto #x, #y;
 $text = gettext(#sx, #sy, #ex, #ey, 0);
 if (strlen($text) <= 1) {
  setsearch searchbuffer, #searchoption;
 } else {
  setsearch $text, #searchoption;
 }
 hilightfound 1;
 find2;
}

endmacro;

isearch:
 #handle = hidemaruhandle(0);
 call escape0x5c searchbuffer;
 $text = $$return;
 openfile "/(-9999,-9999,1,1) /h " + macrodir + "\\replace.temp.mac", noaddh
ist;
 selectall;
 delete;
 overwrite "replacedialog \"" + $text + "\", \"\", hilight";
 if (#inselect) {
  overwrite ", inselect";
 }
 if (searchoption & 0x00000001) {
  overwrite ", word";
 }
 if (searchoption & 0x00000002) {
  overwrite ", casesense";
 }
 if (searchoption & 0x00000010) {
  overwrite ", regular";
 }
 if (searchoption & 0x00000020) {
  overwrite ", fuzzy";
 }
 if (searchoption & 0x00000080) {
  overwrite ", linknext";
 }
 if (searchoption & 0x00000080) {
  overwrite ", linknext";
 }
 if (searchoption & 0x00010000) {
  overwrite ", masknormal";
 }
 if (searchoption & 0x00020000) {
  overwrite ", maskcomment";
 }
 if (searchoption & 0x00040000) {
  overwrite ", maskifdef";
 }
 if (searchoption & 0x00080000) {
  overwrite ", maskscript";
 }
 if (searchoption & 0x00100000) {
  overwrite ", maskstring";
 }
 if (searchoption & 0x00200000) {
  overwrite ", masktag";
 }
 if (searchoption & 0x00400000) {
  overwrite ", maskonly";
 }
 if (searchoption & 0x00800000) {
// TODO: ここの制御の方法がわからない。
//  overwrite ", ";
 }
 if (searchoption & 0x01000000) {
  overwrite ", loop";
 }
 if (searchoption & 0x02000000) {
  overwrite ", noclose";
 }
 overwrite ";";
 gofiletop;
 insertfix "// このマクロは「" + basename2 + "」により自動生成されました。\n";
 save;
 setactivehidemaru #handle;
 closehidemaru findhidemaru(macrodir + "\\replace.temp.mac");
 // TODO: ここで複数行のハイライトを行いたい
 execmacro "replace.temp.mac";
 endmacro;



[ ]
RE:25936 全置換のやり直しがAlt-Aで全置No.25937
秀丸担当 さん 08/12/26 15:43
 

>マクロから置換ダイアログを出した場合、まとめてやり直しができません。
>メニューから置換ダイアログを出した場合、まとめてやり直しができます。

マクロの場合は、互換性維持のために従来通りの動きになるようになっていまし
た。

たしか、まとめてやり直しの機能が無かったバージョンで、まとめてやり直しを
実現するマクロがありました。
その方法は、全置換で置換した個数をどこかに覚えておいて、やり直しマクロで
はその回数だけundo;するというようなマクロだったと思います。
そいったマクロも動くために従来通りになっています。

キー操作の記録と再生では、それでも問題無いように、全置換をキー操作の記録
をしてマクロ化すると、以下のように記録されています。

setcompatiblemode 0x0F;
begingroupundo;
replaceall "a" , "b";
if( ! result )  beep;
endgroupundo 1;

これと同じような感じで、置換ダイアログのマクロの場合は、以下のような感じ
にするといいかもしれません。

begingroupundo;
replacedialog "a", "b";
endgroupundo 1;

[ ]
RE:25937 全置換のやり直しがAlt-Aで全置No.25938
緒方聡 さん 08/12/26 20:55
 
replaceall を使うのではなく find2 でダイアログを出して
全置換を行った場合に、Ctrl-Z でまとめて戻せない、という内容でした。

[ ]
RE:25938 全置換のやり直しがAlt-Aで全置No.25941
秀丸担当 さん 08/12/29 09:54
 

>replaceall を使うのではなく find2 でダイアログを出して
>全置換を行った場合に、Ctrl-Z でまとめて戻せない、という内容でした。

find2で置換フラグがあるときも、replacedialogと同じで、

begingroupundo;
find2;
endgroupundo 1;

とすればいいのではないかと思います。
ただ、キャンセルした場合は空のアンドゥが入ってしまいますが。
キャンセルで result == -2 のときに一回アンドゥを入れると回避できるかもし
れません。

ちなみに endgroupundo の引数に 1 と入っているのはヘルプには無いですが、
動作環境に従うという意味になっていました。

[ ]
RE:25941 全置換のやり直しがAlt-Aで全置No.25943
緒方聡 さん 08/12/29 10:38
 
>begingroupundo;
>find2;
>endgroupundo 1;

言われている意味が理解できました。

>ただ、キャンセルした場合は空のアンドゥが入ってしまいますが。

以下のようなコードで期待通り動作するようになりました。

begingroupundo;
find2;
if (result != -2) {
    endgroupundo 1;
}
endmacro;

単に undo をするだけではだめで、こうするより他ないような
気がします。なんとなく気持ち悪いですが、これはこれで
問題ないですか?

[ ]
RE:25943 全置換のやり直しがAlt-Aで全置No.25944
秀丸担当 さん 08/12/29 11:15
 

>begingroupundo;
>find2;
>if (result != -2) {
>    endgroupundo 1;
>}
>endmacro;
>
>単に undo をするだけではだめで、こうするより他ないような
>気がします。なんとなく気持ち悪いですが、これはこれで
>問題ないですか?

こうするとbegingroupundoとendgroupundoが対にならないので、気持ち悪いです
が、問題は無いと思います。
全置換でなく置換数一個でも動作環境によって問い合わせが出るのはよくないと
思うので、常にまとめてアンドゥなら endgroupundo 1; は引数なしの
endgroupundo;のほうがよかったかもしれないです。

同じ置換ダイアログを出すのにこれだけ煩雑になるのもなんなので、
setcompatiblemodeで互換性を指定できるようになったら一番いいかもしれない
ですが。

[ ]