マクロの「選択した範囲内のみ」検索は?No.01107
tsuboi さん 98/05/27 19:54
 
検索コマンド searchdown などには、[,word]  [,casesense] [,regular] [,fuzzy]
[,linknext] の5つのパラメータが付けられるようになっていますが、検索ダイアロ
グボックスの6個のチェックボックスのうち、「選択した範囲内のみ」に相当するも
のが見当たりません。
マクロで選択範囲内だけを検索するには、どうすれば良いのでしょうか?

[ ]
RE:01107 マクロの「選択した範囲内のみ」No.01108
杉浦 まさき さん 98/05/28 01:59
 
tsuboi さん、こんばんは。
 杉浦 まさき と申します。

>検索コマンド searchdown などには、[,word]  [,casesense] [,regular] [,fuzzy]
>[,linknext] の5つのパラメータが付けられるようになっていますが、検索ダイアロ
>グボックスの6個のチェックボックスのうち、「選択した範囲内のみ」に相当するも
>のが見当たりません。
>マクロで選択範囲内だけを検索するには、どうすれば良いのでしょうか?

最新版(もっと以前からあったけど正確なバージョンを忘れた(^^;)には
 inselect というパラメータが追加されてます。
 これをつければ範囲選択された部分(ただし行単位)の検索ができると思います。
 #行単位ではなく文字単位での検索をしたい時には
  自前で処理する必要があります。
  手前味噌で恐縮ですが(^^;、以下の URL にそのサンプルが置いてあります。
  http://www.ceres.dti.ne.jp/~sugiura/hidemaru/lesson/omake.html




[ ]
RE:01108 マクロの「選択した範囲内のみ」No.01114
tsuboi さん 98/05/28 17:36
 
>最新版(もっと以前からあったけど正確なバージョンを忘れた(^^;)には
> inselect ニいうパラメータが追加されてます。
> これをつければ範囲選択された部分(ただし行単位)の検索ができると思います。
> #行単位ではなく文字単位での検索をしたい時には
>  自前で処理する必要があります。
>  手前味噌で恐縮ですが(^^;、以下の URL にそのサンプルが置いてあります。
>  http://www.ceres.dti.ne.jp/~sugiura/hidemaru/lesson/omake.html
>
>
早速お教えいただき有難うございます。今まで Ver.2.15 を使用していました。 改
版履歴を見ると次の Ver.2.16 で機能追加されていたようです。
早速最新バージョンをダウンロードして試したところ、inselect は受付けてくれま
したが、動作は期待どおりではありません。

検索対象は、選択範囲だけには留まらず、それ以降のファイル末までの行も含まれて
しまいます。
(旧バージョンで inselect が使用できなかったときの検索対象は「選択範囲を除い
て、次の行からファイル末まで」でした。)

しっかり選択範囲内だけを検索対象にするにはどうすれば良いのでしょう。
なお、お教えいただいたURLにはアクセスできましたが、「選択した範囲内で検
索」には長時間待っても繋がらず、まだ見ておりません。これを見れば解決策は分か
るかもしれないのですが・・・

[ ]
RE:01107 マクロの「選択した範囲内のみNo.01124
ひろ さん 98/05/28 23:06
 
 tsuboiさん今日は、ひろです。
> グボックスの6個のチェックボックスのうち、「選択した範囲内のみ」に相当するも
 最新版では inselect が使えます。

[ ]
RE:01114 マクロの「選択した範囲内のみ」No.01125
杉浦 まさき さん 98/05/29 05:04
 
tsuboi さん、こんばんは。
 杉浦 まさき です。

>検索対象は、選択範囲だけには留まらず、それ以降のファイル末までの行も含まれて
>しまいます。

ん?これはバグですかね?

>なお、お教えいただいたURLにはアクセスできましたが、「選択した範囲内で検
>索」には長時間待っても繋がらず、まだ見ておりません。

んではちょっと長いですがここにその内容をアップしときます。

<PRE>
//--------------------------------------------------------------------------
-
//  SEARCHIN    :   範囲選択した領域内で検索を実行するルーチン
//      [Usage] :
//          call SEARCHIN $$s_str, ##flag, ##mode;
//          ##num = ##return;
//
//          $$s_str     :   検索文字列
//          ##flag      :   検索オプションのフラグ(下記の表を参照)
//          ##mode      :   = 0 なら下方向検索、= 1 なら上方向検索
//          ##num       :   見つかったら = 1、見つからなければ = 0
//
//  備考:  Ver.2.16 以降では検索系のコマンドに inselect オプション
//          (範囲選択領域内の検索)が追加され、
//          このルーチンと同等のことが簡単にできるようになりました。
//
//  検索オプションと対応する数字:
//         <検索オプション>      <10進数>
//         単語の検索              1
//         大文字/小文字の区別         2
//         正規表現              16
//         あいまい検索            32
//         次の秀丸も検索(Win95のみ)     128
//      ※  指定したいオプションに対応する数を足した物を第2引数に指定する。
//          ex. 「単語の検索」で「次の秀丸も検索」… 1 + 128 = 129 を指定
//
SEARCHIN:
    escape;
    //  選択範囲の座標を取得
    moveto selendx, selendy;
    ##ex = column+1; ##ey = lineno;
    moveto seltopx, seltopy;
    ##tx = column+1; ##ty = lineno;

    ##selfound = getininum("hidemaru.ini","Env","SelectFound");
    writeininum "hidemaru.ini", "Env", "SelectFound", 1;

    //  前回の検索文字列、検索オプションを保存
    $$s_buf = searchbuffer; ##s_opt = searchoption;
    //  検索条件を設定
    if( (##2 & 32) != 0 ) ##2 = (##2 | 16); //  あいまい検索には正規表現が必

    setsearch $$1, ##2;

    if( !##3 ) finddown;
    else findup;
    if( !result ) ##r = 0;
    else {
        disabledraw;
        escape;
        ##tc = column + 1;
        ##tl = lineno;
        moveto selendx, selendy;
        ##ec = column + 1;
        ##el = lineno;
        // 選択範囲を出たら終了
        if( (##el>##ey) ||
            (##tl<##ty) ||
            (##el==##ey)&&(##ec>##ex) ||
            (##tl==##ty)&&(##tc<##tx) ) ##r = 0;
        else ##r = 1;
    }
    enabledraw;

    setsearch $$s_buf, ##s_opt; //  検索条件の復帰
    writeininum "hidemaru.ini", "Env", "SelectFound", ##selfound;

    return ##r;
//--------------------------------------------------------------------------
-
</PRE>

[ ]
RE:01125 マクロの「選択した範囲内のみ」No.01127
番頭++ さん 98/05/29 15:42
 
>>検索対象は、選択範囲だけには留まらず、それ以降のファイル末までの行も含まれて
>>しまいます。

>ん?これはバグですかね?

皆さん、おはようございますです。
inselect にバグはあります。次の RE: を参考にしてみてください。

01063 98/05/20 15:57 番頭++  inselect オペランド ?
01073 98/05/22 16:25 秀丸担当  RE:01063 inselect オペランド ?

inselect は論理行の(完全な)範囲選択を前提とした仕様で作成されている模様
(想像)ですが、チェックが不完全なためにおかしな動き ??? をします。表現を
変えれば誤解をも招きます。単に selecting を処理すると痛い目にあいます、
です。論理行の完全な selecting ですと inselect は 99.9 % うまくいきます。

selectline; // は OK です。
golinetop2; beginsel; golineend2; right; // right まで必要です。

一般的に、0x0D 改行を1 個でも含むと、論理行の不完全な selecting でも動く
ことが普通です。検索はいいのですが、置換となると undo; の考慮が必要です。

次のような、色々なチェック方法が必要です。これでも完璧ではありません。

//  test1.mac
if( ! selecting ){  endmacro;   }
#x_s = seltopx; #y_s = seltopy; #x_e = selendx; #y_e = selendy;
if( ( #x_s + #x_e ) != 0 ){ endmacro;   }
if( #y_s == #y_e ){ endmacro;   }
searchdown "#", inselect;
endmacro;

論理行の完全な selecting でも、正規表現により選択された文字列が改行を含
むと、話は複雑です。正規表現で選択された文字列の一部が selecting の範囲
内にある時、その処理は「秀丸エディタ」の仕様にしたがって処理されます。そ
れを不満とする使用者は、redo; undo; を実行することになります。これが残り
の 00.1% です。設計時の解釈の相違です。記憶の無い undo; です。

replacedown ... ,inselect; replaceup ... ,inselect; 両方のテストを行なう
必要があります。

このサイトのライブラリ中に「秀丸エディタと関連ソフト」、「No.64 空白文字
の整理/削除マクロ」の中に KZ_SSC2.mac があります。そのコードを参照してく
ださい。隠し機能の、普段は動かない inselect の例があります。その作者は使
用していますが、公表するにはものすごい説明を必要とするので自分だけで使用
しています。KZ_SSC2.mac の色々なチェックをはずして、LZH 中のテストデータ
を処理すると、 inselect の仕様が見えてきます。その様に設計しました。と言
うかテストの残骸です。正規表現が処理してくれる 0xFF を範囲選択の stopper
にして、検索∩置換を行なうと 100% になりますです。

inselect が無い時代の方法ですが。
selecting 部分を

cut; newfile; paste; // openfile "/h temp999.txt"; のほうが美技かも ...
replaceallfast ...;
selectall; cut;
...
setactivehidemaru ...
closehidemaruforced ... newfile close
paste;

と言う方法も硬い方法です。

論理行の(完全な)範囲選択 selecting を行なうことが無難です。

参考になる、ません ???


[ ]