サブルーチンの置換で noword 指定No.08734
おすぎ さん 18/08/20 14:17
 
お世話になっています

サブルーチンで検索/置換を行う際に、
引数で、
casesense, nocasesense の指定はできますが、
word, noword の指定はできません。

サブルーチンの検索/置換で、
noword(文字列)を指定する方法はあるでしょうか?

[ ]
RE:08734 サブルーチンの置換で noword 指No.08735
秀丸担当 さん 18/08/20 15:27
 

searchdown文などで、casesenseの反対のnocasesenseがあるのに対し、wordの反対の
nowordは確かに無いです。
wordを書かなければ、noword相当になります。
casesenseとnocasesenseの場合は、どちらも書かないとregularの指定があるかどう
かよって違いますが、wordの場合はそういうことはなく、wordを書かなければ必ず単
語の検索がOFFになるので、nowordは書かなくていいということになります。


[ ]
RE:08735 サブルーチンの置換で noword 指No.08736
おすぎ さん 18/08/20 15:32
 
サブルーチンで検索を呼び出すときに、
引数で、word と noword の区別をつけたいのですが、
そのような方法はあるでしょうか?

[ ]
RE:08736 サブルーチンの置換で noword 指No.08737
秀丸担当 さん 18/08/20 16:02
 

単純には、searchdownなどを呼び分けるとできることになります。
ただ、この方法の場合、casesense等の他のオプションも全て呼び分けると分岐がも
のすごく大量になります。

【第二パラメータが0か0以外かで文を呼び分ける例】

call Test "abc", 0;
//call Test "abc", 1;
endmacro;

Test:
if(##2 == 0 ) {
  searchdown $$1; //noword相当
} else {
  searchdown $$1,word;
}
return;


wordやcasesenseといった指定ではなく、数値を指定することで、searchoption相当
の値をそのまま指定することができます。
この場合、数値を決めればいいので、searchdownの呼び分けの必要が無くなります。

【searchoption相当の数値のフラグを指定する例】

#flags = 0; //単語の検索OFF 大文字/小文字の区別なし
//#flags = 0x00000001; //単語の検索ON 大文字/小文字の区別なし
//#flags = 0x00000002; //単語の検索OFF 大文字/小文字の区別あり
//#flags = 0x00000001 | 0x00000002; //単語の検索ON 大文字/小文字の区別あり
call Test "abc", #flags;
endmacro;

Test:
searchdown $$1, ##2;  //数値の指定はsearchoption相当
return;

[ ]
RE:08737 サブルーチンの置換で noword 指No.08738
おすぎ さん 18/08/20 17:01
 
searchoption相当の数値のフラグを指定する方法は、ちょっと手強そうなので、
第二パラメータが0か0以外かで文を呼び分ける方法を使ってみます。

助かりました。
ありがとうございました。

[ ]
RE:08738 サブルーチンの置換で noword 指No.08741
おすぎ さん 18/08/21 09:41
 
確認させて下さい。

サブルーチンで、検索や置換を呼び出すときに、
引数で casesense regular 等を指定することはできないのでしょうか?

たとえば次の感じです。

call SEARCH "abc", "casesense", "regular";

SEARCH:
searchdown $$1, $$2, $$3;


大きな勘違いだったらすみません。

[ ]
RE:08741 サブルーチンの置換で noword 指No.08743
でるもんたいいじま さん 18/08/21 10:55
 
でるもんた・いいじまです。

> サブルーチンで、検索や置換を呼び出すときに、
> 引数で casesense regular 等を指定することはできないのでしょうか?
>
> たとえば次の感じです。
>
> call SEARCH "abc", "casesense", "regular";
>
> SEARCH:
> searchdown $$1, $$2, $$3;

うーむ、どうしてもその書き方をしたければ、文字列を読み取って
ビット列を算出するサブルーチンを書いたほうがいいかと。

こんな感じです。
動作確認してないのでミスがあったらごめんなさい。

setcompatiblemode 0x20000;
call SEARCH "abc", "casesense", "regular";
endmacro;

//--------------
SEARCH:
$$keywords = $$1;
##opt = 0; // ここはお好みで値を変えてください
##opt = dwParseSearchOption(##opt, $$2);
##opt = dwParseSearchOption(##opt, $$3);
##opt = dwParseSearchOption(##opt, $$4);
##opt = dwParseSearchOption(##opt, $$5);
##opt = dwParseSearchOption(##opt, $$6);
##opt = dwParseSearchOption(##opt, $$7);
##opt = dwParseSearchOption(##opt, $$8);
##opt = dwParseSearchOption(##opt, $$9);
searchdown $$keywords, ##opt;
return;

//--------------
dwParseSearchOption:
if ( $$2 == "word"        ) return (##1 |  1);
if ( $$2 == "noword"      ) return (##1 & ^1);
if ( $$2 == "casesense"   ) return (##1 |  2);
if ( $$2 == "nocasesense" ) return (##1 & ^2);
//以下すべてのオプションについて同様に書いていく
else message "No such option: [" + $$2 + "]", "Runtime Error", 0x10;

[ ]
RE:08741 サブルーチンの置換で noword 指No.08744
秀丸担当 さん 18/08/21 11:00
 

"casesense"や"regular"といった文字列で、searchdownsのオプションを指定するこ
とはできないです。
状況によって変動するオプションの場合は、やはり、searchoption相当の数値でやる
のがいいと思います。

しいて似た感じにするとしたら、数値の変数にして、それをOR演算(「|」という記
号)で合わせると近い感じになると思います。

#word = 0x00000001;
#casesense = 0x00000002;
#nocasesense = 0x00000000; //0なので実際は無くてもいい
#regular = 0x00000010;
#noregular = 0x00000000;  //0なので実際は無くてもいい
call SEARCH "abc", #casesense | #regular;
endmacro;

SEARCH:
searchdown $$1, ##2;
return;

[ ]
RE:08743 サブルーチンの置換で noword 指No.08745
でるもんたいいじま さん 18/08/21 11:04
 
でるもんた・いいじまです。

> dwParseSearchOption:
> if ( $$2 == "word"        ) return (##1 |  1);
> if ( $$2 == "noword"      ) return (##1 & ^1);
> if ( $$2 == "casesense"   ) return (##1 |  2);
> if ( $$2 == "nocasesense" ) return (##1 & ^2);
> //以下すべてのオプションについて同様に書いていく
> else message "No such option: [" + $$2 + "]", "Runtime Error", 0x10;

最後の1行、こうしないとダメですね。

else {
message "No such option: [" + $$2 + "]", "Runtime Error", 0x10;
endmacro;
}

[ ]
RE:08745 サブルーチンの置換で noword 指No.08746
おすぎ さん 18/08/21 11:18
 
でるもんた・いいじまさん

ありがとうございました。

[ ]
RE:08744 サブルーチンの置換で noword 指No.08747
おすぎ さん 18/08/21 11:23
 
秀丸担当さま

この方法は試したことがないので教えて下さい。

置換する場合は、
@ searchdown 0x00000004 を入れればよいのでしょうか?
A 置換語はどこに入れるのでしょう?
B replaceall のような一括置換はできるでしょうか?

[ ]
RE:08747 サブルーチンの置換で noword 指No.08748
でるもんたいいじま さん 18/08/21 11:44
 
でるもんた・いいじまです。

> 置換する場合は、
> @ searchdown 0x00000004 を入れればよいのでしょうか?
> A 置換語はどこに入れるのでしょう?
> B replaceall のような一括置換はできるでしょうか?

そういえば、マクロヘルプには記載がありませんね。
下記で行けるようです。
replacedown "検索語", "置換語", 数値;
replaceall "検索語", "置換語", 数値;

ですので、まず私の方式だと下記のようになります。
------------------
call REPLACE "あ", "い", "word", "regular";
return;

REPLACE:
$$before = $$1;
$$after  = $$2;
##opt = 0; // 初期値は私の方式では好きに設定できる。
##opt = dwParseSearchOption(##opt, $$3); //3から始める
//中略
##opt = dwParseSearchOption(##opt, $$9);
replacedown $$before, $$after, ##opt;
return;
------------------


あるいは、秀丸担当さんの方式だと下記のようになります。
----------------
call REPLACE "あ", "い", #word | #regular;
return;

REPLACE:
replacedown $$1, $$2, ##3;
return;
---------------

[ ]
RE:08748 サブルーチンの置換で noword 指No.08749
秀丸担当 さん 18/08/21 13:55
 

searchoptionの0x00000004に相当する置換かどうかについては、searchdownで指定し
ても効果は無いです。
置換の場合はreplacedownやreplaceallでできます。
数値のオプションもreplacedownやreplaceallで同じように使えます。
その際、0x00000004は指定する必要は無いです。

でるもんたいいじまさんのreplacedownの例と同じように、replaceallも以下のよう
にできます。

call REPLACEALL "あ", "い", #word | #regular;
endmacro;

REPLACEALL:
replaceall $$1, $$2, ##3;
return;

[ ]
RE:08748 サブルーチンの置換で noword 指No.08750
おすぎ さん 18/08/21 14:40
 
でるもんたいいじま さん

ありがとうございました。

[ ]
RE:08749 サブルーチンの置換で noword 指No.08751
おすぎ さん 18/08/21 14:42
 
秀丸担当さま

ありがとうございました。
だいぶクリアになりました。

[ ]