[ 新規に投稿する ]

サブルーチンの置換で 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 [ コメントを投稿する ]
秀丸担当さま

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

[ 新規に投稿する ]