行頭からの検索を可能にするには?No.28163
rosegardenyk さん 10/05/02 13:52
 
基本的な質問です。お手数かけますがよろしくお願いします。

Text ファイルに1行目から6行目まで次のデータがあるとします。
∫@行目
∬A行目
∫B行目
∬C行目
∫D行目
∬E行目

マクロ1. 検索成功例
gofiletop;
searchdown "[@-E]",regular;
結果:1行目の「@」を選択する。

マクロ2. 検索は成功しても想定外の例
gofiletop;
searchdown "∫[@-E]",regular;
結果:3行目の「∫B」を選択する。

マクロ3. 検索成功例
movetolineno 0,3;beginsel;golineend2;
searchdown "[@-E]",regular,inselect;
message "result = " + str(result);
結果:3行目の「B」を選択する。メッセージ「result = 1」

マクロ4. 検索不成功例
movetolineno 0,3;beginsel;golineend2;
searchdown "∫[@-E]",regular,inselect;
message "result = " + str(result);
結果:メッセージ「result = 0」

質問1:行頭からの検索を成功させるにはどうしたらよいですか?

質問2:質問1とは関係ない inselect 指定の話です。
マクロ5. 検索成功してしまう例
gofiletop;
searchdown "[@-E]",regular,inselect;
結果:1行目の「@」を選択する。
ファイル中に文字列の選択がされていなければinselect指定は無視されるということ
でしょうか。

以上よろしくお願いします。

[ ]
RE:28163 行頭からの検索を可能にするにはNo.28164
IKKI さん 10/05/02 15:38
 
こんにちは。ユーザの IKKI です。

> 質問1:行頭からの検索を成功させるにはどうしたらよいですか?

searchdown2 を使いましょう。

> ファイル中に文字列の選択がされていなければinselect指定は無視されるということ
> でしょうか。

範囲選択とは別に『「選択した範囲のみ」で動作中』という状態があります。
見た目では背景色で(*1)、マクロでは inselecting で判別できます。

*1: 動作環境で [「選択した範囲のみ」で動作中の範囲を中間色で表示] を ON にし
ている場合

[ ]
RE:28164 動作中の範囲」をコントロールすNo.28165
rosegardenyk さん 10/05/02 18:54
 
IKKIさん、早速のお返事ありがとうございます。
>searchdown2 を使いましょう。
ちゃんとこういう文があるのですね。さっそく取り入れました。助かります。

>範囲選択とは別に『「選択した範囲のみ」で動作中』という状態があります。
>見た目では背景色で(*1)、マクロでは inselecting で判別できます。
>
>*1: 動作環境で [「選択した範囲のみ」で動作中の範囲を中間色で表示] を ON に
>している場合
こういう状態とそれを見るための設定もあるのですね。早速設定して自作マクロを動
かしてみました。中間色で表示された一部に検索で選択され反転表示され部分があっ
てわかりやすいです。本当にご教示ありがとうございました。

私の課題は以下のマクロでのループ解消です。
∬で始まる行で検出した数字または英大文字略語がすぐ上の
∫で始まる行にあれば、∬行の後ろに頭に刄}ークをつけて数字または英略語を書き
加えるというものです。
毎回この追加部分を含まない形で範囲選択し直しています。それは正しく選択してい
るのを確認できたのですが、やはり選択範囲を突破して1320にヒットして、ループ
しまいます。検索文をいじることなくループ解消できるでしょうか?

こんな長たらしい質問にお答えいただかなくてもかまいません。
どうしたら「動作中の範囲」をコントロールできるかわからないでいます。setsearc
h とfinddownを使ってみたらぐしゃぐしゃになってしまいました。ご興味があれば、
ご教示ください。

テキストファイル
∫@1,320行目
∬A1320行目132013201320
∫BHAAB行
∬CHAAB行
∫D1996年
∬E1996年

132013201320がループ部分です。最初はありません。


gofiletop;
while (1) {
searchdown2 "^∬.+(?=\n)",regular;
if (!result) break;
 #lineno_e = lineno; #lineno_j = lineno -1;
 #columnlast_e = 1;
 golineend2; #columnend_e = column + 1;
 movetolineno 1,#lineno_j;
 golineend2; #columnend_j = column + 1;
 while (1) {
 movetolineno #columnlast_e,#lineno_e;
 beginsel;
 movetolineno #columnend_e,#lineno_e;
 searchdown2
 "([\\.]?[0-9][0-9,]*[\\.]?[0-9]*|[A-Z][A-Z0-9]+)"
 ,regular,word,inselect;
  if (!result) break;
question "ループしますので 「いいえ」を選んで終了してください";
if (!result) endmacro;
 $SearchKey =
  gettext(seltopx,seltopy,selendx,selendy);
 moveto selendx,selendy;
 #columnlast_e = column + 1;
 movetolineno 1,#lineno_j;
 beginsel;
 movetolineno #columnend_j,#lineno_j;
 searchdown2 $SearchKey,fuzzy,word,inselect;
 #result = result;
 movetolineno 1,#lineno_e;
 golineend2;
 if (!#result) insert "×" + $SearchKey;
 if ( #result) insert "" + $SearchKey;
 }
}
endmacro;


[ ]
RE:28165 動作中の範囲」をコントロールすNo.28166
h-tom さん 10/05/02 19:57
 

h-tom です。

>毎回この追加部分を含まない形で範囲選択し直しています。それは正しく選択してい
>るのを確認できたのですが、やはり選択範囲を突破して1320にヒットして、ループ
>しまいます。検索文をいじることなくループ解消できるでしょうか?
マクロはよく見ていませんが、範囲選択は、基本的に行単位です。
同じ行で、特定部分を選択して検索しても、無視されますよ。

---------------------------
秀丸エディタ
---------------------------
「選択した範囲のみ」の範囲は行単位(改行までの範囲)となります。
---------------------------
OK   キャンセル  
---------------------------

[ ]
RE:28166 動作中の範囲」をコントロールすNo.28167
rosegardenyk さん 10/05/02 21:17
 
h-tom さん
早速ご回答を頂き感謝します。
>マクロはよく見ていませんが、範囲選択は、基本的に行単位です。
>同じ行で、特定部分を選択して検索しても、無視されますよ。
まさにおなじ行で選択しなおしていました。これで納得できます。
別方を考えます。
ありがとうございました。

[ ]