マクロ検索系文の自由度が低いNo.15666
IKKI さん 03/11/06 10:50
 
IKKI です。

置換系のマクロを作っていて不便に思った点が3つあります。

[1] ダイアログの検索文字列をマクロから制御できない
 http://www.maruo.co.jp/hidesoft/2/x13959_.html#13982
 でしてきした問題です。

[2] フラグ指定で全置換できない
 次のように数値で指定する場合、全置換を行う方法が用意されていません。

   setsearch "hogehoge", 0x10;
   setreplace "fugafuga";
   finddown;

[3] 検索ヒストリ、置換ヒストリを取得できない
 レジストリの SearchHist, ReplaceHist は REG_BINARY 型のためマクロから
 読み出す方法がありません。

[1],[2]については自分はすでに田楽 DLL を用いて解決してしまいましたが、
より手軽に自由度の高いマクロが組めるよう改善を検討されてはいかがでしょうか。
以下、私案です。

[1] マクロで find; や replace; を実行したときは searchbuffer の内容を
  そのままダイアログに表示するよう仕様変更。普通にダイアログを出した
  ときと同じ動作とするには事前に getsearch; を実行する。

[2] findall 文、 findallfast 文を新設。

[3] 配列型キーワード searchhist[], replacehist[] を新設、あるいは
  REG_BINARY 型をマクロで扱うアプローチを考える?

[ ]
RE:15666 マクロ検索系文の自由度が低いNo.15674
秀丸担当 さん 03/11/06 17:10
 

>[1] マクロで find; や replace; を実行したときは searchbuffer の内容を
>  そのままダイアログに表示するよう仕様変更。普通にダイアログを出した
>  ときと同じ動作とするには事前に getsearch; を実行する。

find の仕様変更をすると、今まで検索オプションを固定して検索ダイアログを
出すようにして作られたマクロとの互換が無くなってしまいます。
新たに find2 を作って searchbuffer を反映させる文を作るか、finddialog を
作って引数に指定できるようにするかではどうでしょう。

>[2] findall 文、 findallfast 文を新設。

これがあるとマクロが作りやすくなるかもしれません。
検索の場合は意味が無いので、全置換専用ということになるので、findallとい
う名前はエレガントではありますがスッキリしない気がします。

>[3] 配列型キーワード searchhist[], replacehist[] を新設、あるいは
>  REG_BINARY 型をマクロで扱うアプローチを考える?

作るとしたら、配列型キーワードではなく、関数になります。
$a = getsearchhist(n);
という感じです。どうでしょう。
バイナリを扱うのは困難なのでやめておきます。

[ ]
RE:15666 マクロ検索系文の自由度が低いNo.15676
Iranoan さん 03/11/06 17:53
 
 IKKI さん今日は、Iranoan です。
> [2] フラグ指定で全置換できない
>  次のように数値で指定する場合、全置換を行う方法が用意されていません。
>
>    setsearch "hogehoge", 0x10;
>    setreplace "fugafuga";
>    finddown;
 私は、
setsearch "hogehoge", 0x10;
setreplace "fugafuga";
disabledraw;
moveto 0, 0;
while( result )finddown;
で十分という考えです。ただこの辺りは、私のように (沢山命令があってもど
うせ覚えられないから、)「希望の処理が出来るプリミティブな命令があれば
十分」とするか、「書き手の労力を減らせるように幾つかの命令は追加された
ほうが良い」という考え方の違いでしょうね。
 因みに私の確認した範囲では、上記の方法と replaceallfast の差はありま
せんでした。

> [3] 検索ヒストリ、置換ヒストリを取得できない
>  レジストリの SearchHist, ReplaceHist は REG_BINARY 型のためマクロから
>  読み出す方法がありません。
 私はこれより、マクロ実行後にもヒストリに残るような処理をしたいことが
あるのですが、これが出来なくて歯痒いことがあります。

> [1] マクロで find; や replace; を実行したときは searchbuffer の内容を
>   そのままダイアログに表示するよう仕様変更。普通にダイアログを出した
>   ときと同じ動作とするには事前に getsearch; を実行する。
 どうせダイアログ・ボックスを出して使い手の指示待ちになるのですから、
この様に変更しても影響は小さそうだし賛成。

[ ]
RE:15674 マクロ検索系文の自由度が低いNo.15683
IKKI さん 03/11/07 03:14
 
IKKI です。すみません、ひとつ忘れてました…

[4] フラグ指定で「選択した範囲内のみ」の検索・置換ができない
 事前に
   searchdown ".", regular, inselect;
   gosearchstarted;
 などとすれば可能でしょうけれど、そういう屁理屈は置いておいて…

 私案:
  ・「選択した範囲内のみ」もフラグとして扱えるようにする
  ・escapeinselect に対応する enterinselect を新設
 とは言ってみたものの、普段使わないので良いのかどうかわかりません。
 何か適切な方法はあるでしょうか。

以下、返信です。

> >[1] マクロで find; や replace; を実行したときは searchbuffer の内容を
> >  そのままダイアログに表示するよう仕様変更。
>
> 新たに find2 を作って searchbuffer を反映させる文を作るか、finddialog を
> 作って引数に指定できるようにするかではどうでしょう。

後者がわかりやすいし汎用性もあって良いと思います。
検索系文の命名規則(*1)からして名前は searchdialog, replacedialog の方が適切
な気がします。
仕様をいろいろ考えてみた結果、2つのアプローチに行き着きました。

A案■ユーザーの使い勝手を重視するなら

  searchdialog "検索文字列", casesense, word;
  replacedialog "検索文字列", "置換文字列", ask, linknext;

という形が使いやすそうです。 searchup 等と同じ文法で自然に書けます。
引数を省略した場合は searchbuffer を反映させます。そうすれば

  setsearch "検索文字列", 0x03;
  searchdialog;

としてフラグを数値で指定することもできますし、

  getsearch;
  searchdialog;

と書けば既存の find 文の完全な代替となります(*2)。

----------------
*1 命名規則
  find* …バッファから実行。フラグのビット2によって検索または置換。
  set*  …引数からバッファへ代入。フラグを数値で指定。
  search*  …引数から実行。オプションをキーワードで指定。
  replace* …引数から実行。オプションをキーワードで指定。

*2 今後ダイアログを出すには searchdialog 文を使ってもらうことにして
  find 文は互換性のためだけに残す(ヘルプから消す)こともできます。
  find 文だけ命名規則から外れているし、動作もわかりにくいですから。
----------------

B案■マクロエンジンの仕様肥大化を抑えるなら

  find "検索文字列", 0x03;
  replace "検索文字列", "置換文字列", 0x88;

という具合に引数を付けたらそれが反映されるようにすればよさそうです。
引数を省略した場合は従来通り裏で getsearch します。
検索オプションをキーワードで指定する方法との両立は難しいでしょう。


> >[3] 配列型キーワード searchhist[], replacehist[] を新設
>
> 作るとしたら、配列型キーワードではなく、関数になります。
> $a = getsearchhist(n);
> という感じです。どうでしょう。

いいですね。
同時に setsearchhist 文も作れば Iranoan さんの要望も満たされそうです。
ぜひ両方ともお願いします。

> >[2] findall 文、 findallfast 文を新設。
>
> これがあるとマクロが作りやすくなるかもしれません。
> 検索の場合は意味が無いので、全置換専用ということになるので、findallとい
> う名前はエレガントではありますがスッキリしない気がします。

私もそう思いますが、現在の命名規則に則るなら他に名付けようがないです。
何か妙案はないものか…

[ ]
RE:15676 マクロ検索系文の自由度が低いNo.15684
IKKI さん 03/11/07 03:15
 
IKKI です。以下は雑談になります。

>  私は、
> setsearch "hogehoge", 0x10;
> setreplace "fugafuga";
> disabledraw;
> moveto 0, 0;
> while( result )finddown;
> で十分という考えです。ただこの辺りは、私のように (沢山命令があってもど
> うせ覚えられないから、)「希望の処理が出来るプリミティブな命令があれば
> 十分」とするか、「書き手の労力を減らせるように幾つかの命令は追加された
> ほうが良い」という考え方の違いでしょうね。

そうですね。その意味で Iranoan さんと私は対照的なところがあり、両者の意見が
公開の場で文章化されることは有意義だと思います。
最終的には秀丸担当さんや秀まるおさんが全体のバランスを考えて采配をふるうわけ
ですが、その判断材料として役立っていれば幸いです。

私の立場は

 ・多数の命令の中からヘルプを読んで適切なものを探すことは誰にでもできる。
 ・少数の命令を組み合わせて希望の処理を書くことは誰にでもできるとは限らない。

という考えです。
そもそも本体が持っている処理ルーチンをわざわざマクロでエミュレートするのはナ
ンセンスだと思うのですが、秀丸ユーザーの中ではこういう人は少数派なのかな?

ついでに、今さらながら http://www.maruo.co.jp/turukame/3/m030111.html#1363
へのコメントを書きますと… A(^^;;;

マクロの本領はエディタの画面上でインタラクティブな処理をすることだと思います。
起動してから0.1秒で結果が現れるのと0.5秒かかるのとでは使い勝手が大きく異なり
ます。そういう意味で、たとえば大文字小文字変換のために1文字ずつ切り出して
ループなんていう処理は非常にもったいないわけです。だから、多くのユーザーにと
って使い勝手の向上につながると思われる機能については、たとえ現状で実現可能で
あっても要望を出していく所存です。


>  因みに私の確認した範囲では、上記の方法と replaceallfast の差はありま
> せんでした。

揚げ足をとるつもりはありませんが、結果以外に重要な点として

 (1) [キャンセル] ボタンが現れない
 (2) 実行速度が遅い(Iranoan さんのコードで3倍弱、田楽を使うと3倍超)

という違いがあります。特に(1)はユーザーインターフェイス的に欠かせないでしょう。

[ ]
RE:15683 マクロ検索系文の自由度が低いNo.15696
秀丸担当 さん 03/11/07 17:38
 

>[4] フラグ指定で「選択した範囲内のみ」の検索・置換ができない

とりあえず現状では8ビット使ってしまっており、内部構造を変更する必要が出
てくるので、必要性もないのであれば考えないことにします。

>後者がわかりやすいし汎用性もあって良いと思います。
>検索系文の命名規則(*1)からして名前は searchdialog, replacedialog の方が適切
>な気がします。

searchdialogとreplacedialogで作ることにしようと思います。
引数の省略はできないですが、できないとまずいでしょうか。

>いいですね。
>同時に setsearchhist 文も作れば Iranoan さんの要望も満たされそうです。
>ぜひ両方ともお願いします。

getsearchhist, getreplacehist, setsearchhist, setreplacehistを作ることに
しようと思います。

>私もそう思いますが、現在の命名規則に則るなら他に名付けようがないです。
>何か妙案はないものか…

メニュー(キー割り当て)にコマンドが無いのにfindallという文が存在させるこ
ともそもそも変な気がしますし、完全ではないものの代替方法もあるので保留と
させてください。

[ ]
RE:15696 マクロ検索系文の自由度が低いNo.15704
IKKI さん 03/11/07 21:22
 
IKKI です。ご検討ありがとうございます。

> >[4] フラグ指定で「選択した範囲内のみ」の検索・置換ができない
>
> とりあえず現状では8ビット使ってしまっており、内部構造を変更する必要が出
> てくるので、必要性もないのであれば考えないことにします。

#15656 によると

> 次のバージョンで、互換性に問題が無ければ、searchoptionとsetsearchのビッ
> ト8〜10に「サブフォルダも検索」「最小化状態で実行」「ファイル名をフル
> パスで出力」を追加することにしようと思います。

とのことだったので、この部分を拡張されるのかなと思いました。


> searchdialogとreplacedialogで作ることにしようと思います。
> 引数の省略はできないですが、できないとまずいでしょうか。

フラグを数値で指定できる方法が必要です。引数が省略できないなら

  searchdialog "検索文字列", 0x03;
  searchdialog "検索文字列", casesense, word;

のようにどちらでも指定できるようにするのも一案かと思います。
それも無理だとすると結局 searchdialog2 も作るとかいう話になって余計に混乱し
そうです。

# というか、 title 文の例からして引数は省略できるものと考えていました。
 searchdialog 文で引数が省略できないのはなぜでしょう?


> getsearchhist, getreplacehist, setsearchhist, setreplacehistを作ることに
> しようと思います。

よろしくお願いします。

> メニュー(キー割り当て)にコマンドが無いのにfindallという文が存在させるこ
> ともそもそも変な気がしますし、完全ではないものの代替方法もあるので保留と
> させてください。

わかりました。

[ ]
RE:15704 マクロ検索系文の自由度が低いNo.15729
秀丸担当 さん 03/11/10 20:02
 

>> 次のバージョンで、互換性に問題が無ければ、searchoptionとsetsearchのビッ
>> ト8〜10に「サブフォルダも検索」「最小化状態で実行」「ファイル名をフル
>> パスで出力」を追加することにしようと思います。
>
>とのことだったので、この部分を拡張されるのかなと思いました。

実は内部的にはsearchoptionとsetsearchは32ビット使用できますが、
searchdown等では、内部的に8ビットしかないので、容易に増やすことができま
せん。
とはいってもバイナリで互換性を維持しなくてはならないのは「キー操作の記
録」として保存されているものだけなので、バージョンアップしたら「キー操作
の記録」をしていたものを捨ててしまうようにすればできなくもないですが。

>フラグを数値で指定できる方法が必要です。引数が省略できないなら
>
>  searchdialog "検索文字列", 0x03;
>  searchdialog "検索文字列", casesense, word;
>
>のようにどちらでも指定できるようにするのも一案かと思います。
>それも無理だとすると結局 searchdialog2 も作るとかいう話になって余計に混乱し
>そうです。
>
># というか、 title 文の例からして引数は省略できるものと考えていました。
> searchdialog 文で引数が省略できないのはなぜでしょう?

searchdialogで引数が省略できないのは、searchdown等の処理を流用して作った
ためです。
searchdown等がもともと引数を省略できない文として作られています。数値が指
定できないのも同様です。
流用せずにsearchdialog文を新規に作り直せばいいですが。

さらに、もともとオプションだけは省略できるので、

searchdialog "文字列";

とした場合、オプションを引き継ぐのか、オプション全て無しにしたいのか
searchdownの仕様は変えられないので、混同してしまいます。

ちなみに、数値で0x10と指定するのと、単にregularと指定するのでは意味が違
います。単にregularと指定すると、自動的にcasesenseになります。
単にfuzzyを指定しても自動的にreglarになります。
もともとsearchdown等のパラメタは数値が指定できるものではないところに数値
が指定できるようにするのもいろいろ問題があります。

[ ]
RE:15729 マクロ検索系文の自由度が低いNo.15733
IKKI さん 03/11/10 21:27
 
IKKI です。お手数をおかけしております。

話のつながりが見えにくくなってきましたが、現在の要点は

 ・ダイアログの検索文字列をマクロから制御したい
 ・オプションを数値で指定したい

です。これらを一気に実現する方法として次の2つを提案しました。

A案■第1引数は省略可、第2引数はキーワードのみ(数値指定には setsearch を併用)
  searchdialog;                // すべて引き継ぎ
  searchdialog "検索文字列";          // オプションなし
  searchdialog "検索文字列", casesense, word; // キーワード指定

B案■第1引数は省略不可、第2引数は数値も可
  searchdialog "検索文字列";          // オプションなし
  searchdialog "検索文字列", casesense, word; // キーワード指定
  searchdialog "検索文字列", 0x03;      // 数値指定
  searchdialog searchbuffer, 0x03;      // 検索文字列引き継ぎ
  searchdialog "検索文字列", searchoption;  // オプション引き継ぎ
  searchdialog searchbuffer, searchoption;  // すべて引き継ぎ

私の考えた限りでは、これ以外の方法で2つの要点を満たすことは難しいです。
# 他の方のご意見もお聞きできればよいのですが。

> 流用せずにsearchdialog文を新規に作り直せばいいですが。

ご苦労お察しいたしますが、この機会に着手されると将来的にも役立つのではないか
と愚考いたします。

> もともとsearchdown等のパラメタは数値が指定できるものではないところに数値
> が指定できるようにするのもいろいろ問題があります。

いままで文法エラーになっていた書き方が利用できるようになることでどのような問
題が発生すると考えられるでしょうか。

[ ]
RE:15729 マクロ検索系文の自由度が低いNo.15734
IKKI さん 03/11/10 21:36
 
IKKI です。

> > [4] フラグ指定で「選択した範囲内のみ」の検索・置換ができない

この件に関して

  searchdown ".", regular, inselect;
  gosearchstarted;
  setsearch "hogehoge", 0x03;
  finddown;

という方法を試してみたところ、検索バッファの内容を変えると「選択した範囲内の
み」の範囲が解除されてしまうようです。
現状で実現方法はありませんでしょうか。

[ ]
RE:15734 マクロ検索系文の自由度が低いNo.15737
秀まるお2 さん 03/11/10 22:34
 
 大変面倒ではありますが、

    setsearch XXXX,nnn;
    finddown;

 とする部分を、nnnの値に応じて適当にsearchdownするように分岐しまくった
ら、一応ちゃんと動くんじゃないかとは思います。

    if( #opt & 1 ) {
        if( #opt & 2 ) {
            if( #opt & 0x10 ) {
                if( #opt & 0x20 ) {
                    if( selecting ) {
                        searchdown XXXX, word, fuzzy, inselect;
                    } else {
                        searchdown XXXX, word, fuzzy;
                    }
                } else {
                    if( selecting ) {
                        searchdown XXXX, word, regular, inselect;
                    } else {
                        searchdown XXXX, word, regular;
                    }
               }
           } else {
      ...
      ...

 ってな具合になりますけど…。

[ ]
RE:15737 マクロ検索系文の自由度が低いNo.15738
IKKI さん 03/11/10 23:23
 
IKKI です。夜分ご苦労さまです。

>  大変面倒ではありますが、
>
>     setsearch XXXX,nnn;
>     finddown;
>
>  とする部分を、nnnの値に応じて適当にsearchdownするように分岐しまくった
> ら、一応ちゃんと動くんじゃないかとは思います。

やはりそれしかないですか…。(^^;;
# 山紫水明さんが http://hide.maruo.co.jp/lib/macro/replace28.html の中で同様
の方法を採られていますね。

あるいは別ファイルに書き出して execmacro するか。

いずれにせよ緊急の課題ではないのでサポート業務の方を優先していただくのがよろ
しいかと思います。そちらが落ち着いたら再度ご検討ください。


//------- FindInSelectByFlag.mac ------------------------------------
setsearch "se", 0x9c;
setreplace "せ";
call FindInSelectByFlag;
endmacro;

FindInSelectByFlag:
if (selecting) ##inselect = yes;
$tmpfile = macrodir + "\\tmp.mac";
#myhandle = hidemaruhandle(0);
openfile "/h";
#macrohandle = hidemaruhandle(0);
if (searchoption & 0x04) {
 insert "replacedown \"" + searchbuffer + "\", \"" + replacebuffer + "\"";
} else {
 insert "searchdown \"" + searchbuffer + "\"";
}
if (##inselect)          insert ", inselect";
if (searchoption & 0x01) insert ", word";
if (searchoption & 0x02) insert ", casesense";
if (searchoption & 0x08) insert ", ask";
if (searchoption & 0x10) insert ", regular";
if (searchoption & 0x20) insert ", fuzzy";
if (searchoption & 0x80) insert ", linknext";
insert ";\n";
saveas $tmpfile;
setactivehidemaru #myhandle;
closehidemaru #macrohandle;
execmacro $tmpfile;
// run getenv("ComSpec") + " /c del " + $tmpfile;
return;

[ ]
RE:15738 マクロ検索系文の自由度が低いNo.15739
秀まるお2 さん 03/11/10 23:51
 
>あるいは別ファイルに書き出して execmacro するか。

 これはこれは、チカラワザというか、もはや秀丸制作者の想像を絶した世界が
存在するといった感じです。

[ ]
RE:15739 マクロ検索系文の自由度が低いNo.15740
IKKI さん 03/11/11 00:21
 
IKKI です。以下は雑談です。

> >あるいは別ファイルに書き出して execmacro するか。
>
>  これはこれは、チカラワザというか、もはや秀丸制作者の想像を絶した世界が
> 存在するといった感じです。

(笑)
できれば使いたくない最後の手段です。
とはいえ if で分岐しまくると少なくとも128行必要なのが24行で済んでしまう。
悩ましいですね。

ちなみにこの一連の話題は↓を作る過程で湧いてきたものです。
http://www18.big.or.jp/~fujiwara/ikki/hidemaru/misc/#ReplaceDialogEx
たかだか汎用置換マクロを作るにもこのくらい頭を悩ませなければなりません。
まぁ、現在の秀丸マクロの限界がこのへんにあるということでしょうか。

[ ]
RE:15733 マクロ検索系文の自由度が低いNo.15747
秀丸担当 さん 03/11/11 16:14
 

>私の考えた限りでは、これ以外の方法で2つの要点を満たすことは難しいです。
># 他の方のご意見もお聞きできればよいのですが。
>
>> 流用せずにsearchdialog文を新規に作り直せばいいですが。
>
>ご苦労お察しいたしますが、この機会に着手されると将来的にも役立つのではないか
>と愚考いたします。

大変申しわけありませんが、searchdialogの件は他のことが大変になってきたた
め、簡単に仕様が決められない複雑なことになりそうなので保留とさせていただ
きます。

[ ]
RE:15747 マクロ検索系文の自由度が低いNo.15748
IKKI さん 03/11/11 17:48
 
IKKI です。

> 大変申しわけありませんが、searchdialogの件は他のことが大変になってきたた
> め、簡単に仕様が決められない複雑なことになりそうなので保留とさせていただ
> きます。

わかりました。特に急を要する課題でもありませんので、他の件が落ち着いたら
改めてご検討いただきたいと思います。よろしくお願いいたします。

[ ]
RE:15738 マクロ検索系文の自由度が低いNo.15753
山紫水明 さん 03/11/12 00:05
 
 IKKIさん,こんばんは。

》やはりそれしかないですか…。(^^;;
》# 山紫水明さんが http://hide.maruo.co.jp/lib/macro/replace28.html の中
》で同様の方法を採られていますね。

 言及いただき恐縮です。もっとスマートなやり方はないものかと思いつつも,
強引にやってしまったものです。検索関係のコマンド,最近いろいろ動きがあ
り,あのマクロも手を入れなければならないと思い,このスレッドの成り行き注
目していたのですが。

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

[ ]
RE:15753 マクロ検索系文の自由度が低いNo.15764
IKKI さん 03/11/14 01:56
 
山紫水明さん、こんばんは(はじめまして)。 IKKI です。
以下は雑談です。

>  言及いただき恐縮です。もっとスマートなやり方はないものかと思いつつも,
> 強引にやってしまったものです。検索関係のコマンド,最近いろいろ動きがあ
> り,あのマクロも手を入れなければならないと思い,このスレッドの成り行き注
> 目していたのですが。

そうでしたか。
私はまだ3年しか秀丸を使っていないもので、他のベテラン諸氏のお考えも
気になっていました。今後ともご鞭撻のほどよろしくお願い申し上げます。

いずれにせよ、あの方法が秀まるおさんの推薦を得られたということで (^^;
とりあえず inselect については 64 個の if を書こうと思います。

[ ]