前後行取得grepNo.01061
なむnomoto さん 00/02/25 13:18
 

  半可通の、なむ野本です。

 教えて下さい。
 grepして、検索ヒットした行の前後行も同時に取得して、
 同時に3行表示するマクロって可能でしょうか?
  テキストデータは改行された3行になります。
  (どこかに在ったような気もしないでもないですが)
 どうか、教えて下さいませ。

  ヒット行の、下2行も同時に表示。
     とか
  ヒット行の、上2行も同時表示。

 なんてのが切り替えられると良いのですが。
 どうか宜しくお願いします。
 

[ ]
RE:01061 前後行取得grepNo.01062
きいろいまふらあ さん 00/02/25 15:33
 
きいろいまふらあです。

秀丸とは別のQGrepというアプリケーションにそんな機能があります。
Vectorとかで探せばすぐ見つかるでしょう。

> grepして、検索ヒットした行の前後行も同時に取得して、
> 同時に3行表示するマクロって可能でしょうか?

grepの結果から各論理行に対して

tagjumpした先で前後のn行を取得して、
backtagjumpで戻って、
貼り付けてから各行の頭にタグを(生成して)挿入して

ってのをやればやれなくないと思います。

というわけで回答としては「不可能ではない」と思います。
#タグの生成ってのがちょっと怪しいですけど。(^^;

2番会議室の#04969からのツリーもご覧ください。

[ ]
RE:01061 前後行取得grepNo.01063
ひろ さん 00/02/25 17:12
 
 なむnomoto さん今日は、ひろです。
>  grepして、検索ヒットした行の前後行も同時に取得して、
>  同時に3行表示するマクロって可能でしょうか?
 可能です。しかし実用的な速度が得られるとは思えませんので、作りませ
ん(^^;。http://www2k.biglobe.ne.jp/~araken/qgrep.htm にある Qgrep を
使えば、設定さえすれば秀丸で tag jump も出来ます。

[ ]
RE:01063 前後行取得grepNo.01066
なむnomoto さん 00/02/25 20:24
 

  きいろいまふらあさん、
 ひろさん、
            なむnomotoです

 素早いコメントありがとう御座います。
 Qgrepは、あるんですが、ほとんど使わない。
 「秀丸」エディタで足りてたからです。

>>  同時に3行表示するマクロって可能でしょうか?
> 可能です。しかし実用的な速度が得られるとは思えませんので、作りませ
>ん(^^;。

 「秀丸」では速度に問題があるんですか。
  では早速、Qgrepをやってみます。

  

[ ]
RE:01066 前後行取得grepNo.01068
きいろいまふらあ さん 00/02/25 21:05
 
まふです。
もうちょっと作り込んでからアップしようかとも思いましたが。
とりあえず最小限の要素は含んでいるということで。
#ちょっと無駄なコードが混じっていますが気にしないでください。

grepしてから実行してください。
なお、クリップボードの中身は維持されません。

//---exgrep.mac by Go TAKAGI (C)2000
#myabove = 2;
#mybelow = 2;

gofiletop;
$myname = filename;
while(1){
loop1:
while(code != ')'){right;}
right;
if(code != ':') goto loop1;
$mytag = gettext(0,y,x,y);
tagjump;
#i = #myabove;while(#i > 0){call lineup;#i = #i - 1;}
beginsel;
#i = #myabove+#mybelow+1;while(#i > 0){call linedown;#i = #i - 1;}
copy;
$name = filename;
setactivehidemaru findhidemaru($myname);
closehidemaru findhidemaru($name);
golineend2;
call linedown;
paste;
insert "--- " + $mytag + " ---\n";
if (code == -1) break;
}
endmacro;

lineup:
golinetop2;
up;
golinetop2;
return;

linedown:
golineend2;
down;
golinetop2;
return;
//---

[ ]
RE:01068 前後行取得grepNo.01078
きいろいまふらあ さん 00/02/27 01:57
 
まふです。
たまたま時間があったのでちょっと改造してみました。

その前に>秀丸担当様

これ作っていて気づいたのですが、
「テンポラリファイルを使って再オープンの高速化」をしてるときに、
内容が更新された(保存されてない状態の)ファイルを
closehidemaruforced を使って閉じてから、もいちど開くと
内容が更新された状態で開かれてしまうことがあります。

再現条件はわかりません。
必ず起きるというわけではないようです。

過去に報告があったかもしれませんが、バグ(かなあ?)リストには
入ってますでしょうか?

さて、本題。
grep結果の秀丸で実行してみて下さい。

//ここから
//exgrep.mac
//by Go TAKAGI
//
//初期設定値
#myabove = 2;
#mybelow = 2;
$myseparater = "---";
$myfailedmes = "(Failed): ";

//ファイルの先頭に移動
gofiletop;
//自分の名前を覚える
$myname = filename;
//タグジャンプする前に秀丸の数を数えておく
#myhidemarucount = hidemarucount;

while(code != -1){
//ためしにタグジャンプ
    tagjump;
//失敗したら次の行に移動してタグジャンプ(を繰り返す)
    if(result == no){
        insert $myfailedmes;
        golineend2;
        if (code == -1) break;
        movetolineno 1,lineno+1;
        if (code == -1) break;
        tagjump;
    }
    backtagjump;
//タグの取得
loop1:
    while(code != ')'){right;}
    right;
    if(code != ':') goto loop1;
    while(code != '('){left;}
    $mytag = gettext(0,y,x,y);
//あらためて
    tagjump;
    #myedit = 0;
    #mylineno = lineno;
    if(hidemarucount == #myhidemarucount){
        #is_newwindow = false;
    }else{
        #is_newwindow = true;
    }
//ジャンプした先でもってくる部分の先頭に移動
    #mygoto = #mylineno - #myabove;
    while(1){
        movetolineno 1,#mygoto;
        if(lineno == #mygoto)break;
        #mygoto = #mygoto+1;
    }
    #mylinenotop = lineno;
//もってくる部分の末尾位置を取得
    #mygoto = #mylineno + #mybelow;
    while(1){
        movetolineno 1,#mygoto;
        if(lineno == #mygoto)break;
        #mygoto = #mygoto-1;
    }
    golineend2;
    insert "\n";#myedit = #myedit+1;
    #mylinenoend = lineno;
//行の頭にタグもどきを入れながら降りて行く
    movetolineno 1, #mylinenotop;
    while(1){
//message "insert";
        insert $mytag + "(" + str(lineno) + "): ";#myedit = #myedit+1;
        movetolineno 1, lineno+1;
        if(lineno == #mylinenoend)break;
    }
//あらためてもってくる部分を範囲選択してコピー
    movetolineno 1,#mylinenotop;
    beginsel;
    movetolineno 1,#mylinenoend;
    copy;
//新たに開かれたウィンドウでない場合、タグとかつけたのを戻してもとのウィンド
ウに戻る
    if(!#is_newwindow){
        while(#myedit != 0){
            undo;
            #myedit = #myedit-1;
        }
        setactivehidemaru findhidemaru($myname);
    }else{
//新たに開かれたウィンドウの場合、もとのウィンドウに戻って開いたウィンドウを
閉じる
        while(#myedit != 0){
            undo;
            #myedit = #myedit-1;
        }
//以上5行はほんとは不要。
//しかし「テンポラリファイルを使用して再オープンの高速化」の場合、なんかおか
しいので念のためundoしておく
        $name = filename;
        setactivehidemaru findhidemaru($myname);
        closehidemaruforced findhidemaru($name);
    }
    selectline;
    delete;
    paste;
   
    insert $myseparater + "\n";
    if (code == -1) break;
}
endmacro;
//ここまで

[ ]
RE:01078 前後行取得grepNo.01103
きいろいまふらあ さん 00/03/02 00:40
 
まふです。反応がなく寂しいので。

>過去に報告があったかもしれませんが、バグ(かなあ?)リストには
>入ってますでしょうか?

いかがでしょうか?>秀丸担当様

[ ]
RE:01103 前後行取得grepNo.01105
なむnomoto さん 00/03/02 01:42
 

  きいろいまふらあ、さん
               なむnomotoです


>まふです。反応がなく寂しいので。

  ごめんなさい。遅くなって済みません。
 頂いたマクロを使ってみていたのです。
   # QGERPにするかな〜と、試して見たり

 なんか変です。gerpした後のマクロ実行ですよね。
 gerpした画面で、マクロを実行しました。

 マクロ結果画面は、なんだか解りません。

  gerp画面        マクロ実行画面
  1                       意味不明行
    2                       2の前行3行
    3                       意味不明行
    4            変な出力行
    5            5

  なんて感じです。(^^;)

 まふさんのマシンでは、期待通りの結果ですか?
 私のは、ver3.01です。Windows95。NEC PC98.


[ ]
RE:01105 前後行取得grepNo.01107
きいろいまふらあ さん 00/03/02 09:32
 
まふです。
ちょっと思い入れが出てきたので。(^^;
しばらくお付き合いいただけます?>なむnomotoさん

> マクロ結果画面は、なんだか解りません。

実際のgrep直後の画面と、マクロ実行後の画面を
見せていただけませんか?差し支えなければ。

> まふさんのマシンでは、期待通りの結果ですか?

私のとこじゃとりあえず期待通りです。
環境設定依存か、まふの想像力が足りないか。
ちなみにファイル名フルパスでは試してないです。:-p
#手動でtagjumpできれば同じこと、と思ってた、が。

むう。

[ ]
RE:01107 前後行取得grepNo.01111
なむnomoto さん 00/03/02 15:33
 
       なむnomotoです

>ちょっと思い入れが出てきたので。(^^;
>しばらくお付き合いいただけます?>なむnomotoさん

 わ、嬉しいなあ〜。
  #でも、週末(土日)は駄目なんです。それ以外の日ってことで。
   金帰月来してるもんで。(^^;)

>> マクロ結果画面は、なんだか解りません。
>
>実際のgrep直後の画面と、マクロ実行後の画面を
>見せていただけませんか?差し支えなければ。

 んでは。ちょっと長いですが。
 ---------Grepの画面-----「智慧」をgrepしました-----
龍王經.txt(70): 0598_,15,0132b18(00):<vc/>除婬怒癡冥照以智慧光
龍王經.txt(86): 0598_,15,0132c05(00):<vc/>布施及戒忍精進禪智慧
龍王經.txt(148): 0598_,15,0133b09(01):不貪色痛志得智慧擁護一切。是爲五。
龍王經.txt(160): 0598_,15,0133b21(06):博聞智慧利於明達聞無厭足。
龍王經.txt(176): 0598_,15,0133c08(00):順所智慧救濟惡智。
龍王經.txt(195): 0598_,15,0133c27(03):而應智慧。一切所興以行爲要。是爲八。
龍王經.txt(274): 0598_,15,0134c19(03):積徳不厭合集智慧。不樂聲聞縁覺之智。是
爲八。
龍王經.txt(278): 0598_,15,0134c23(04):修行禪定其心不荒。成于智慧而離塵勞。
龍王經.txt(295): 0598_,15,0135a11(05):身行清淨功徳熾盛。口言清淨智慧巍巍。
龍王經.txt(330): 0598_,15,0135b17(03):佛語龍王。菩薩智慧殊異。手執慧燈。分明
智慧。
龍王經.txt(331): 0598_,15,0135b18(00):智慧最勝。持智慧劍有所興造。
龍王經.txt(332): 0598_,15,0135b19(05):皆以智慧建立智慧。而以布施持戒忍辱精進
禪思智慧。
 --------Maro実行結果--------
龍王經.txt(70): 0598_,15,0132b18(00):<vc/>除婬怒癡冥照以智慧光
龍王經.txt(86): 0598_,15,0132c05(00):<vc/>布施及戒忍精進禪智慧
龍王經.txt(148): 0598_,15,0133b09(01):不貪色痛志得智慧擁護一切。是爲五。
龍王經.txt(160): 0598_,15,0133b21(06):博聞智慧利於明達聞無厭足。
龍王經.txt(176): 0598_,15,0133c08(00):順所智慧救濟惡智。
龍王經.txt(195): 0598_,15,0133c27(03):而應智慧。一切所興以行爲要。是爲八。
龍王經.txt(274): 0598_,15,0134c19(03):積徳不厭合集智慧。不樂聲聞縁覺之智。是
爲八。
龍王經.txt(278): 0598_,15,0134c23(04):修行禪定其心不荒。成于智慧而離塵勞。
龍王經.txt(295): 0598_,15,0135a11(05):身行清淨功徳熾盛。口言清淨智慧巍巍。
龍王經.txt(330): 0598_,15,0135b17(03):佛語龍王。菩薩智慧殊異。手執慧燈。分明
智慧。
龍王經.txt(331): 0598_,15,0135b18(00):智慧最勝。持智慧劍有所興造。
龍王經.txt(332): 0598_,15,0135b19(05):皆以智慧建立智慧。而以布施持戒忍辱精進
禪思智慧。
龍王經.txt(1): 龍王經.txt(70): 0598_,15,0132b18(00):<vc/>除婬怒癡冥照以智慧光
龍王經.txt(2): 龍王經.txt(86): 0598_,15,0132c05(00):<vc/>布施及戒忍精進禪智慧
龍王經.txt(3): 龍王經.txt(148): 0598_,15,0133b09(01):不貪色痛志得智慧擁護一
切。是爲五。
---
0598_,15,0135b19(05):皆以智慧建立智慧。而以布施持戒忍辱精進禪思智慧。
0598_,15,0135b20(00):建立智慧。修行於戒忍辱精進一心。
0598_,15,0135b21(02):普觀諸法建立智慧開化衆生。
0598_,15,0135b22(07):菩薩何謂建立智慧而行布施等於布施。布施已等等於吾我。
---
0598_,15,0135b20(00):建立智慧。修行於戒忍辱精進一心。
0598_,15,0135b21(02):普觀諸法建立智慧開化衆生。
0598_,15,0135b22(07):菩薩何謂建立智慧而行布施等於布施。布施已等等於吾我。
0598_,15,0135b23(00):吾我已等便等於人。已等於人諸法得等。
---
0598_,15,0135b25(02):既所施者不隨塵勞。而以施時捨一切塵。
0598_,15,0135b26(02):亦復如是。捨一切生則一切施。
0598_,15,0135b27(07):離諸住見棄諸所有。是爲菩薩建立智慧而以施彼。
0598_,15,0135b28(04):何謂菩薩建立智慧而奉禁戒。見身意寂斯護禁戒。
---
0598_,15,0135b26(02):亦復如是。捨一切生則一切施。
0598_,15,0135b27(07):離諸住見棄諸所有。是爲菩薩建立智慧而以施彼。
0598_,15,0135b28(04):何謂菩薩建立智慧而奉禁戒。見身意寂斯護禁戒。
0598_,15,0135b29(01):不倚身口意。不倚今世後世。亦無内外。
---
 ------------以上------------

 どのように前後行を取得したのか解りかねます。

>
>> まふさんのマシンでは、期待通りの結果ですか?
>
>私のとこじゃとりあえず期待通りです。
>環境設定依存か、まふの想像力が足りないか。

 え?え? 現在の画面をgrepして、Macroを実行下のですが....

>ちなみにファイル名フルパスでは試してないです。:-p
>#手動でtagjumpできれば同じこと、と思ってた、が。

 tagjump は手動で良いんですが.....
 tagの無い行があるんは、本文前後行ですよね。?
                   なむnomoto
 

[ ]
RE:01107 前後行取得grepNo.01112
なむnomoto さん 00/03/02 15:40
 

  なむnomotoです

 ちょっと関係有るんで教えて下さい。

 行頭の改行マークは、
    ^\n
  ですよね。
 行頭にある空改行は無視して(そのままにして)、
 行末の改行だけを指定する正規表現は、
   [^^\n]\n
  じゃないですね。どのように書くんでしょうか?
       $\n
  は、秀丸に 無い! と叱られるし。(^^;)



[ ]
RE:01112 前後行取得No.01115
かかし さん 00/03/02 15:52
 
かかしです、こんにちは。

> ちょっと関係有るんで教えて下さい。
>
> 行頭の改行マークは、
>    ^\n
>  ですよね。
> 行頭にある空改行は無視して(そのままにして)、
> 行末の改行だけを指定する正規表現は、
>   [^^\n]\n
>  じゃないですね。どのように書くんでしょうか?
>       $\n
>  は、秀丸に 無い! と叱られるし。(^^;)

.+\n
ではどうでしょう?
(改行文字以外が)一文字以上ある行って解釈で・・・。


---かかし

[ ]
RE:01078 前後行取得grepNo.01117
秀丸担当 さん 00/03/02 18:13
 
>その前に>秀丸担当様
>
>これ作っていて気づいたのですが、
>「テンポラリファイルを使って再オープンの高速化」をしてるときに、
>内容が更新された(保存されてない状態の)ファイルを
>closehidemaruforced を使って閉じてから、もいちど開くと
>内容が更新された状態で開かれてしまうことがあります。
>
>再現条件はわかりません。
>必ず起きるというわけではないようです。
>
>過去に報告があったかもしれませんが、バグ(かなあ?)リストには
>入ってますでしょうか?

返事が遅かったでした。すみません。
試してみたところ、たまに再現することがありました。
「保存するときに空白をタブに変換」のときにも同様の報告がありました。
直しておきます。

[ ]
RE:01111 前後行取得grepNo.01118
きいろいまふらあ さん 00/03/02 19:24
 
頭悪いまふです。

> え?え? 現在の画面をgrepして、Macroを実行下のですが....

このテストしてなかった。(^^;

> tagの無い行があるんは、本文前後行ですよね。?

前後の行にもtagをつけてやってるつもりだったのですが。
ちと調べます。

[ ]
RE:01118 前後行取得grepNo.01119
きいろいまふらあ さん 00/03/03 00:47
 
まふです。
確かになんかおかしい。

>> え?え? 現在の画面をgrepして、Macroを実行下のですが....
>このテストしてなかった。(^^;

色々試してたらなんか秀丸がすごく不安定になってしまいました。(^^;
もうちょっと調べてみますが、ウィンドウの切り替えが
マクロの進行に追いついてないような気がしてきました。
#と根拠のない責任転嫁。(^^;

tagjumpしてすぐbacktagjumpしたときに
元のウィンドウに戻る前にマクロが進行しているように見える。

ちょっと前のclosehidemaruが失敗する件と関係あるかなあ?

[ ]
RE:01115 前後行取得No.01133
なむnomoto さん 00/03/03 23:13
 

  なむnomotoです


  かかしさん、ありがとうございます。

>.+\n
>ではどうでしょう?
>(改行文字以外が)一文字以上ある行って解釈で・・・。

  駄目です。お試しあれ。行全体がヒットします。

  行頭の\nだけを避けるんです。
  行末の\nの前の文字を拾ってはイケナイです。
  文字行末の\nだけヒットする書き方が解りません。


[ ]
RE:01133 前後行取得No.01135
ひろ さん 00/03/04 13:11
 
 なむnomotoさん今日は、ひろです。
> >.+\n
> >ではどうでしょう?
> >(改行文字以外が)一文字以上ある行って解釈で・・・。
>
>   駄目です。お試しあれ。行全体がヒットします。
 「[^\n]\n」で出来ます。

[ ]
RE:01112 前後行取得grepNo.01136
きいろいまふらあ さん 00/03/04 13:22
 
まふです。
どう関係あるのかわからないんですが……

> 行末の改行だけを指定する正規表現は、

行末の改行じゃない改行ってのがるか知りませんが、んなこた置いといて

置換であれば例えば正規表現で
検索文字列→.+\f\n
置換文字列→\0hoge
とすることで、行頭以外の位置にある改行をhogeに置換できますね。
---
aaaaaaa
bbbbbbb

ccccccc

ddddddd
eeeeeee
---

---
aaaaaaahogebbbbbbbhoge
ccccccchoge
dddddddhogeeeeeeeehoge
---

検索では不可能ですね。多分。

「\n」を「@\n」に置換
→「^@\n」を「\n」に置換
→「@\n」を検索

で、行頭以外の位置にある改行を検索した、といえるかもしれません。
もっとも検索して何をしたいかで最適なやりかたも変わってくるでしょうね。

前後行取得grepの方は改良検討中です。

[ ]
RE:01135 前後行取得No.01137
きいろいまふらあ さん 00/03/04 13:37
 
まふです。

> 「[^\n]\n」で出来ます。

改行の直前の1文字もヒットしちゃいます?(^^;

繰り返しになりますが、この件については「何をしたいか」によって
やりかたが変わってくると思います。>なむnomotoさん

[ ]
RE:01137 前後行取得No.01138
ひろ さん 00/03/05 12:49
 
 きいろいまふらあさん今日は、ひろです。
> > 「[^\n]\n」で出来ます。
>
> 改行の直前の1文字もヒットしちゃいます?(^^;
 すいませんこれでは「.\n」と同じですよね。

[ ]
RE:01137 前後行取得No.01139
かかし さん 00/03/05 15:36
 
かかしです、こんにちは。

なむnomotoさん、まふさんこんにちは。

>>.+\n
>>ではどうでしょう?
 :
>  行頭の\nだけを避けるんです。
>  行末の\nの前の文字を拾ってはイケナイです。
>  文字行末の\nだけヒットする書き方が解りません。

のメールを読んで返信しようと思ったことは、すべてまふさんが
おっしゃっておりました。

つまり
「%f」と「\0」を使って置換する手段がある。
ということと
「何に使いたいか」
ということです。

こんな私でもなにかいい代替案が浮かぶかもしれません。

---かかし

[ ]
RE:01112 前後行取得No.01150
かかし さん 00/03/06 21:42
 
かかしです、こんにちは。

> 行末の改行だけを指定する正規表現は、
>   [^^\n]\n
>  じゃないですね。どのように書くんでしょうか?

もう忘れられてしまったかもしれないけど
せっかくだから・・・。

//   行末の改行コードを探すマクロ
//   2000.03.06  
//
 searchdown "\n" ,regular;
 while(x == 0){
  searchdown "\n" ,regular;
  if(!result){
   beep;
   break;
  }
 }

endmacro;


---かかし

[ ]
RE:01150 前後行取得No.01151
なむnomoto さん 00/03/06 23:26
 
  きいろいマフラーさん
 ひろさん、
 かかし さん、
          有り難うございます。
    
  まとめてしまって済みません。
                 なむ野本です
               金帰月来なんで、土日が駄目です。(^^;)

【かかしさん】
>
>//   行末の改行コードを探すマクロ

 おお、マクロまで出てきたぞ(^o^)

 でも、改行全部にヒットしてしまう。(^^;)

 問題は、置換ですね。改行マーク直前の文字が、消えてはイケナイ
 ので、困ってしまいました。

 で、空改行だけを、%\n に置き換えといて、他の改行をタグに
 置き換えて、10万行を1万行弱に減らし、Excelで読んで、
 好きなように並べ替えるんです。
 秀丸は、非常に時間がかかるので、jperl で やってしまいました。 #しかし、
秀丸のやり方がホントは解っていない。(^^;)

 jperl -pe "s/^\n/%\n/" hoge > geho
  jperl -pe "s/\n/\t/ geho > geho2
  jperl -pe "s/\t%\t/\n/" geho2 > hoge3
   これで、前後行grepヒットマクロがなくても、
  表計算、検索ヒット、並び替え、部分コピー
  テキスト書き出し、タグを改行に置き換え。
  部分抜き出し終わり。
  なんて面倒な方法を考えついたんですが、凄く面倒です。
   (^^;)(^o^)(^^;)
 
   前後行取得マクロがあると、便利どすえ〜(京都弁)
  きいろいマフラーさん、期待してます〜。





[ ]
RE:01151 前後行取得No.01152
きいろいまふらあ さん 00/03/07 10:54
 
きいろい*まふらあ*です。

>  きいろいマフラーさん

むっちゃ違和感。(^^;

> でも、改行全部にヒットしてしまう。(^^;)

?まふんとこではうまく動きますよ?

> 問題は、置換ですね。改行マーク直前の文字が、消えてはイケナイ
> ので、困ってしまいました。

これのやりかた書きました。

> で、空改行だけを、%\n に置き換えといて、他の改行をタグに
> 置き換えて、

これもやりかた書きました。
#でも、もともとの改行の直前に%があったらどうするんですか?

> 秀丸は、非常に時間がかかるので、jperl で やってしまいました。

それならjperlでやるのが正解なんじゃないの?

>  なんて面倒な方法を考えついたんですが、凄く面倒です。

多分秀丸でやる方が凄く面倒です。しかも遅いでしょう。憶測ですが。
どうしても秀丸でやりたいのなら、必要なことは#01136に書いたつもりです。

>   前後行取得マクロがあると、便利どすえ〜(京都弁)

私も作りたいのはやまやまなんですが、tagjump使うと秀丸がすごく不安定に
なるつーことで、ちょっとおあずけです。
気長に待って下さい。待たなくてもいいですけど。

[ ]
RE:01119 前後行取得grepNo.01153
ENCODINGSHIFTJIS さん 00/03/07 16:53
 
画面転換を少なくした例。です 半完成品です。
発想はエディタぽくないです。

// 最後に来てやっとどんな物が必要かわかってきた。
// 1 ファイル grep からの 前後行取得
// 開いている面は 元面とそれのgrep 面として
// grep 面よりマクロ起動します。
//  検索語 強調表示まではしません
// 配列を使うから万行は無理かもしれない。
// tagjump を使う方がはるかに簡単


gofiletop searchdown "("; $fname=gettext(0,0,x,0);// 元面ファイル名
       #hwnd=findhidemaru($fname);
if(-1==#hwnd){       menu $fname,"を開いてからです";endmacro }

// 複数ファイル混在チェックは省略しています。
        #c=0;
while(eof!=code){ // 行番号取得
golinetop2 searchdown "\\([0-9]+",regular; right;
beginsel   searchdown ")";
#lnoary[#c]= val(gettext(seltopx,seltopy,selendx,selendy));
        #c=#c+1;
golineend2;right; // 次行に
 }
//gofileend;
//#i=0;while(#c>#i){insert str(#lnoary[#i]); insertreturn #i=#i+1;}
// ----------------------------------------------
// 前後3行に行番号を増やす。わかりやすいかな?増やさなくても
// できるが行数が多くなりそう。重復行をまとめる
//
         #i=0;   #lno=0;             #k=0;
while(#c>#i){ #j=#lnoary[#i]-2; // 前1行から
        while(#j<#lnoary[#i]+1){
           if(#j>#lno){ #lno=#j;#rang[#k]=#lno; #k=#k+1; }
              #j=#j+1;          }
                         #i=#i+1; }
//
//gofileend;
//#i=0;while(#k>#i){insert str(#rang[#i]); insertreturn #i=#i+1;}
// -----------------------------------------------
while(#hwnd!=hidemaruhandle(0))setactivehidemaru #hwnd;
changename ""; // 適当な名前
// 先に行番号付けとかなきゃ。
//
#i=#k; gofileend beginsel // 上から消すと行番号がずれる
while(0<#i){ #i=#i-1; moveto 0,#rang[#i]; down;delete up; beginsel }
escape;
endmacro

[ ]
RE:01152 前後行取得No.01154
かかし さん 00/03/07 17:05
 
かかしです、こんにちは。

>> でも、改行全部にヒットしてしまう。(^^;)
>
>?まふんとこではうまく動きますよ?

ちゃんと動くの確認したんだけど、あれ?

>>  なんて面倒な方法を考えついたんですが、凄く面倒です。
>
>多分秀丸でやる方が凄く面倒です。しかも遅いでしょう。憶測ですが。
>どうしても秀丸でやりたいのなら、必要なことは#01136に書いたつもりです。

[^^\n]\f\n → \0<BR>

と置換して下さい。

ということですよね>まふさん

---かかし

[ ]
RE:01154 前後行取得No.01156
きいろいまふらあ さん 00/03/07 18:24
 
まふです。

>ということですよね>まふさん

です。
ま、.\f\n→\0<BR> で充分。
#マクロにするなら\のエスケープを忘れずに。

念のため。
---
aaa↓
bbb↓

ccc↓
[EOF]
---

---
aaa<BR>bbb<BR>↓
ccc<BR>[EOF]
---
になりますが、bbbとcccの間の空行がなくなるのは
なむnomotoさんの要求通り。
#↓は改行のつもり。

[ ]
RE:01153 前後行取得grepNo.01157
なむnomoto さん 00/03/08 09:03
 
  ENCODINGSHIFTJISさん
              なむnomotoです


>画面転換を少なくした例。です 半完成品です。
>発想はエディタぽくないです。

 早速、やってみました。
 grepした画面で、マクロ実行ですよね。
 
 ううう、カーソルが頻繁に点滅してるだけです。
 なんか、おかしいのは、私のせい???

 もちろん、そちらでは巧く行ってるんですよね?



[ ]
RE:01156 前後行取得No.01158
なむnomoto さん 00/03/08 09:07
 

  きいろいまふらあさん

                なむnomotoです

  確かに、希望通りになりました。

 置換できました。出来ました。できた。\改行
  置換できました。出来ました。できた。\改行
  置換できました。出来ました。できた。\改行

>になりますが、bbbとcccの間の空行がなくなるのは
>なむnomotoさんの要求通り。

 そうでした。有り難うございました。


[ ]
RE:01154 前後行取得No.01159
なむnomoto さん 00/03/08 09:14
 
 かかしさん

  なむnomotoです

>[^^\n]\f\n → \0<BR>
>
>と置換して下さい。
>
>ということですよね>まふさん

  ありがとうございます。
   希望通りです。


[ ]
RE:01152 前後行取得No.01160
なむnomoto さん 00/03/08 09:31
 

 きいろいまふらあさん
             なむnomotoです

>>  きいろいマフラーさん
>
>むっちゃ違和感。(^^;

 わ。申し訳ないです。めちゃ違和(^^;)ごめんなさい。
   \O付きなんですか。ロゴなんですね。
    ## 昔は ”マフラー”でしたっけ?       

>> でも、改行全部にヒットしてしまう。(^^;)
>
>?まふんとこではうまく動きますよ?

 検索で用心してやったからです。
 「検索ではうまくない」とあったのに(^^;)
 置換では、巧く行きました。

>> で、空改行だけを、%\n に置き換えといて、他の改行をタグに
>> 置き換えて、
>
>これもやりかた書きました。
>#でも、もともとの改行の直前に%があったらどうするんですか?

 %がないのは、grepで確かめてあったからです。
 後で、%でなく「裸」に置換しました。裸だと、消すのを忘れないで
 良く気が付くからです。-->恥ずかしい(#^_^#)

>> 秀丸は、非常に時間がかかるので、jperl で やってしまいました。
>
>それならjperlでやるのが正解なんじゃないの?

  前後行取得jperlが書けないから(^^;)
 #あれ? そういわれてみれば、ありましたね、なんか
 H氏のそんなスクリプト。

>>  なんて面倒な方法を考えついたんですが、凄く面倒です。
>
>多分秀丸でやる方が凄く面倒です。しかも遅いでしょう。憶測ですが。

 どうしたいかによって、方法が違うわけですが、
 今回抜き出すのは、データ修正のための前段階ですから、
 簡単に抜き出せるマクロが、欲しいところです。
 
 でも今後、このようなツールはあれば便利だと思います。
 1)カーソル行の前後だけ
  2)全行の前後行 
   と選択肢があると、良いかも知れません。
 Qgrepのような、Hgrepができると良いですね。


>どうしても秀丸でやりたいのなら、必要なことは#01136に書いたつもりです。

 はい、これ出来ました。実験不足。ありがとうございました。


>私も作りたいのはやまやまなんですが、tagjump使うと秀丸がすごく不安定に
>なるつーことで、ちょっとおあずけです。
>気長に待って下さい。待たなくてもいいですけど。

  待ってますって、期待して(^o^)

[ ]
RE:01157 前後行取得grepNo.01162
ENCODINGSHIFTJIS さん 00/03/08 12:41
 
> もちろん、そちらでは巧く行ってるんですよね?
テストで使った行が全て短かったためです。少し直しました。

// まず小さなデータでテストしてみて下さい。元&localgrep面 ペア
// 1ペアのみ処理できます。
// 一応、デバッグ版を作りました。
// 最後の up や down が悪いかもしれません。長い行は??
//
// デバッグ実行で書いた末尾の行番号が正しければ,
// 途中の endmacro をコメントアウトして再挑戦してみてください。

//goto s1:
gofiletop searchdown "("; $fname=gettext(0,0,x,0);// 元面ファイル名
       #hwnd=findhidemaru($fname);
if(-1==#hwnd){       menu $fname,"を開いてからです";endmacro }

// 複数ファイル混在チェックは省略しています。
//s1:
        #c=0;
while(eof!=code){ // 行番号取得
golinetop2 searchdown "\\([0-9]+",regular; right;
beginsel   searchdown ")";
#lnoary[#c]= val(gettext(seltopx,seltopy,selendx,selendy));
        #c=#c+1;
golineend2;right; // 次行に
 }
gofileend; insertreturn insert "tags line No.-1 ==== \n";
#i=0;while(#c>#i){insert str(#lnoary[#i]); insertreturn #i=#i+1;}
// ----------------------------------------------
// 前後3行に行番号を増やす。わかりやすいかな?増やさなくても
// できるが行数が多くなりそう。重復行をまとめる
//
         #i=0;   #lno=0;             #k=0;
while(#c>#i){ #j=#lnoary[#i]-1; // 前1行から
        while(#j<#lnoary[#i]+2){
           if(#j>#lno){ #lno=#j;#rang[#k]=#lno; #k=#k+1; }
              #j=#j+1;          }
                         #i=#i+1; }
//
gofileend; insertreturn insert "抽出 line No.-1 ==== \n";
#i=0;while(#k>#i){insert str(#rang[#i]); insertreturn #i=#i+1;}
// -----------------------------------------------
endmacro // 途中で stop  <<<<<<<<<<<<<<<<<<<<<<<<
while(#hwnd!=hidemaruhandle(0))setactivehidemaru #hwnd;
changename ""; // 適当な名前
menu "元面に転換しているか?";if(!result)endmacro
// 先に行番号付けとかなきゃ。
//    
#i=#k; escape; gofileend beginsel // 上から消すと行番号がずれる
while(0<#i){ #i=#i-1; movetolineno 1,#rang[#i];// 論理行ベース
 golineend2 right;
  delete
   left; golinetop2
    beginsel }
escape;
endmacro

__E__

[ ]
RE:01160 前後行取得No.01163
きいろいまふらあ さん 00/03/08 23:47
 
まふです。暇人ですかね?(^^;

>   \O付きなんですか。ロゴなんですね。

ロゴ?違うと思います。

>    ## 昔は ”マフラー”でしたっけ?       

???
生まれてこのかたこの名前ですが?
#Yellow Mufflerと表記したことはありますが。

>>> でも、改行全部にヒットしてしまう。(^^;)
>>?まふんとこではうまく動きますよ?
> 検索で用心してやったからです。
> 置換では、巧く行きました。

これって、かかしさんのマクロの話でしょ?
検索ですよ?
検索のままでうまくいきますよ???

> 今回抜き出すのは、データ修正のための前段階ですから、

それは初耳でした。

>  待ってますって、期待して(^o^)

(現在の内容)に対するgrepに限定されるのなら、
ENCODINGSHIFTJISさんのマクロで充分だと思います。
#安定して動けばね。(^^;

わたしのはもうちょっと無謀なので。(^^;

[ ]
RE:01162 前後行取得grepNo.01164
ENCODINGSHIFTJIS さん 00/03/09 12:01
 
最後が残ります。(自分では使わないのがチェックが甘い)
  left; golinetop2
                   beginsel }
gofiletop delete           // 1行追加
  escape;
  endmacro

行番号はどこかのマクロからコピーして下さい。

__E__

[ ]
RE:01163 前後行取得No.01166
なむnomoto さん 00/03/09 17:37
 

 きいろいまふらあ さん
              なむnomotoです

>まふです。暇人ですかね?(^^;

 そうとは、思えません。

>>   \O付きなんですか。ロゴなんですね。
>ロゴ?違うと思います。
>>    ## 昔は ”マフラー”でしたっけ?       
>???
>生まれてこのかたこの名前ですが?
>#Yellow Mufflerと表記したことはありますが。

 ううん、では私の脳味噌が腐っている証拠です。
 申し訳ないことでした。別に似た名の方もあった
 ようでしたが、あの方は別人ですよね。
  (やっぱり腐ってる?)

>これって、かかしさんのマクロの話でしょ?
>検索ですよ?
>検索のままでうまくいきますよ???

 ええと、".+\f\n" では、行全体が検索ヒットします。
 "\0\t"に置換すると、ちゃんと置換されて、文字削除
 されません。 行末の\nに、ぴたっと検索ヒットしま
 せんけど、これで良いのですよね。

>> 今回抜き出すのは、データ修正のための前段階ですから、
>
>それは初耳でした。

 説明不足でした。


>>  待ってますって、期待して(^o^)
>
>(現在の内容)に対するgrepに限定されるのなら、
>ENCODINGSHIFTJISさんのマクロで充分だと思います。
>#安定して動けばね。(^^;
>
>わたしのはもうちょっと無謀なので。(^^;

 ENCODINGSHIFTJISさんのは、使えるって付言ですね。
 まふさんの、安心説明に安堵します。


[ ]
RE:01164 前後行取得grepNo.01167
なむnomoto さん 00/03/09 17:56
 
  ENCODINGSHIFTJIS
             なむ野本です

      
>最後が残ります。(自分では使わないのがチェックが甘い)
>  left; golinetop2
>                   beginsel }
>gofiletop delete           // 1行追加
>  escape;
>  endmacro
>
>行番号はどこかのマクロからコピーして下さい。


 有り難うございます。
 早速やってみたのですが、grep結果画面でマクロを
 実行したのですが、やはり、カーソルが頻繁に
 点滅してるだけです。  ESCで、中止します。

 本文と、grep画面と両方立ち上がっています。
 本文の行は、1行60バイト無いです。(^^;)

  私の「秀丸」エディタがおかしいのだろうか。
 NEC PC98 秀丸はVer.3.01 ですが。
>
>__E__

[ ]
RE:01166 前後行取得No.01168
かかし さん 00/03/09 18:31
 
かかしです、こんにちは。

> きいろいまふらあ さん
>              なむnomotoです

こんにちは。

> ええと、".+\f\n" では、行全体が検索ヒットします。
> "\0\t"に置換すると、ちゃんと置換されて、文字削除
> されません。 行末の\nに、ぴたっと検索ヒットしま
> せんけど、これで良いのですよね。

これは、どういう事かというと、
「検索でヒットした値を置換でそのまま用いる」という
考え方なんです。
検索で見つかった単語は、\0,\1,\2・・・
として、置換で使えるんです。\fは、その区切り文字だと
考えて下さい。
「.+\f\n」の場合「.+」と「\n」に分けられて前者は\0、後者は\1と
なります。
でもって、「\0\t」と書くと「.+」にヒットした部分はそのままで
\n だけが \t に置換されることになります。

という説明で、検索にヒットするけど置換されない(様に見える)理由が
わかりましたでしょうか?


---かかし

[ ]
RE:01162 前後行取得grepNo.01169
ENCODINGSHIFTJIS さん 00/03/09 18:53
 
//全然進まないのなら頭の search で回っているのかも
//私は、正規表現パワーアップDLL(BRegIf.DLL) Arimac 1999/11/20
//に入れ換えてますからね。
//しかし golinend2 right; があるから少なくとも行は進むはず。
//では遠距離デバッグに入ります。
// grep 面は手操作で 頭10件くらいに削除してから実行
//
gofiletop
#c=0;
while(eof!=code){ // 行番号取得
golinetop2
 searchdown "\\([0-9]+",regular;
if(!result){menu "行番号頭出し失敗");endmacro }
  right; beginsel   searchdown ")";
#lnoary[#c]= val(gettext(seltopx,seltopy,selendx,selendy));
if(!result){menu str(#lnoary[#c]),"番号#ERR";endmacro }
#c=#c+1;
golineend2 right; // 次行に
menu "行は進んでいる?";
 }

// 最初の searchdown は "("; でもかまわない。
// 一体どこで回っています
// 次の末尾書出しもしていない?

 

[ ]
RE:01168 前後行取得No.01171
なむnomoto さん 00/03/09 22:09
 

>かかしです、こんにちは。

       なむnomotoです  こんばんわ。

>> ええと、".+\f\n" では、行全体が検索ヒットします。
>> "\0\t"に置換すると、ちゃんと置換されて、文字削除
>> されません。 行末の\nに、ぴたっと検索ヒットしま
>> せんけど、これで良いのですよね。
>
>これは、どういう事かというと、
>「検索でヒットした値を置換でそのまま用いる」という
>考え方なんです。
>検索で見つかった単語は、\0,\1,\2・・・
>として、置換で使えるんです。\fは、その区切り文字だと
>考えて下さい。

  有り難うございます。 
 \fは、perlテキストでは、改ページ文字となってるんで
 そう思ったんが間違いのようですね。(^^;)

>「.+\f\n」の場合「.+」と「\n」に分けられて前者は\0、後者は\1と
>なります。
>でもって、「\0\t」と書くと「.+」にヒットした部分はそのままで
>\n だけが \t に置換されることになります。
>
>という説明で、検索にヒットするけど置換されない(様に見える)理由が
>わかりましたでしょうか?

 わかりました。\0 は ヌル文字 で、\nを規定してるンか
 と早とちりしたのが原因のようです。ゼロとオーと表示が
 同じなので、文字コードを調べたら\ゼロでした。じゃあ、
 ヌル文字の方は、\オーのほうですかね?

 ところで、これは、秀丸独自で、jperl でやると成功しません。
 ちょっと違うという理解で良いのでしょうか?
 s/.+\f\n/\0\t/;
          で駄目でした。(^^;)



[ ]
RE:01169 前後行取得grepNo.01172
なむnomoto さん 00/03/09 22:22
 

ENCODINGSHIFTJISさん
            なむnomotoです

 ええと、ワテのマシン不整備で申し訳ないです。
 新新 前後行取得2マクロとして実行しました。
 【エラー】
 マクロのバッファがオーバーしました。マクロ登録を
 使って下さい。
         が出まして、次の箇所を指示してます。

if(!result){menu "行番号頭出し失敗");endmacro }

 何のことでしょうか?
 で、今度は頻繁フラッシュすらもありません。(・_;)

>//全然進まないのなら頭の search で回っているのかも

 1.マクロ(1行挿入の)は、そうらしかったです。

>//私は、正規表現パワーアップDLL(BRegIf.DLL) Arimac 1999/11/20
>//に入れ換えてますからね。

 秀丸用のがあるんですか?

>//しかし golinend2 right; があるから少なくとも行は進むはず。
>//では遠距離デバッグに入ります。
>// grep 面は手操作で 頭10件くらいに削除してから実行

  9行で実行しました。

>// 一体どこで回っています
>// 次の末尾書出しもしていない?

  はい、出てません。よろしくお願いします。

 

[ ]
RE:01171 前後行取得No.01173
でるもんた さん 00/03/09 22:32
 
>  わかりました。\0 は ヌル文字 で、\nを規定してるンか
>  と早とちりしたのが原因のようです。ゼロとオーと表示が
>  同じなので、文字コードを調べたら\ゼロでした。じゃあ、
>  ヌル文字の方は、\オーのほうですかね?

いえ、秀丸ではヌル文字が扱えないというのが仕様だとのことです。

>  ところで、これは、秀丸独自で、jperl でやると成功しません。
>  ちょっと違うという理解で良いのでしょうか?
>  s/.+\f\n/\0\t/;
>           で駄目でした。(^^;)

秀丸独特の記法ですね。
Perl(や、その元になった sed・awk)では s/(.+)\n/\1\t/; とします。
括弧でくくった部分を、\1、\2 といった形で参照します。
括弧のネストがある場合は、左括弧の出現順序で番号が決まります。

[ ]
RE:01168 前後行取得No.01174
なむnomoto さん 00/03/09 22:32
 

  かかしさん
          なむnomotoです  

 ついでで済みません、教えて下さい。

 hogeに検索ヒットできるとします。

  hoge xxxnnnxxmmdd hoge hhhkjhg.

 なんて行の、「2回目だけヒットする」と云うような
 書き方はあるんでしょうか?

 それと、4桁の年号"1987"のような書き方は、perlに

  \d{4} または、[12]\d{3}

  があるようですが、
 このような書き方が秀丸で出来るでしょうか。

 perlでは、s/(\d{4}\.)/\t$1/g などと、そんな表記の
 前に、タブを記入できますが、秀丸ではできないでしょうか? 

            なむnomoto



[ ]
RE:01173 前後行取得No.01175
なむnomoto さん 00/03/09 22:44
 

  でるもんた さん

  初めまして(かな?) なむnomotoです


>いえ、秀丸ではヌル文字が扱えないというのが仕様だとのことです。

 ありがとうございます。

>>  s/.+\f\n/\0\t/;
>>           で駄目でした。(^^;)
>
>秀丸独特の記法ですね。
>Perl(や、その元になった sed・awk)では s/(.+)\n/\1\t/; とします。

  実行してみました。そうなりました。なるほどと思った次第。
  s/(.+)\n/$1\t/ も同じになりました(^o^)

>括弧のネストがある場合は、左括弧の出現順序で番号が決まります。

 秀丸は、( )が無くても可能と云うことですね?

[ ]
RE:01166 前後行取得No.01176
きいろいまふらあ さん 00/03/09 23:48
 
まふです。ちょっと後悔したりして。(^^;

>>これって、かかしさんのマクロの話でしょ?
>>検索ですよ?
>>検索のままでうまくいきますよ???
>
> ええと、".+\f\n" では、行全体が検索ヒットします。
> "\0\t"に置換すると、ちゃんと置換されて、文字削除
> されません。 行末の\nに、ぴたっと検索ヒットしま
> せんけど、これで良いのですよね。

じゃなくてさーーーーーーーーーー。(-_-;
かかしさんのマクロはぴたっと検索ヒットするでしょ?行頭でない\nに。
#折り返した改行文字がたまたま1桁目にいたらだめかもしれないけど。

#01174の件(行頭でないhogeの検索)も同じ考え方でできるはず。
トライしてみては如何?>なむnomotoさん

> ENCODINGSHIFTJISさんのは、使えるって付言ですね。
> まふさんの、安心説明に安堵します。

文言通りに解釈して下さい。
深い意味や思いはありません。

ちょっとガラが悪くてすみません。

[ ]
RE:01175 前後行取得No.01177
きいろいまふらあ さん 00/03/09 23:57
 
まふです。

先の発言で書こうかどうしようか迷ったのですが

> 秀丸は、( )が無くても可能と云うことですね?

そもそも正規表現の文法(作法)は言語?によって違うものです。
先にあるものに似せれば似るし、
全く同じ文法を採用すれば、まあ同じになります。

その辺の感覚を磨かれた方がよいですよ。

とりあえず、秀丸の実装している正規表現がどんな仕様になっているか、
ヘルプをお読みになって下さい。
ヘルプの記述が理解できなければ読解のお手伝いはしますが。

#一部ヘルプの通りでなかったりすることもあるかもしれませんけど。

かの斉藤秀夫さんもおっしゃってます。
「ただしヘルプくらいはちゃんと読んでください。」

どこに書いてあるかは内緒です。

[ ]
RE:01174 前後行取得No.01179
かかし さん 00/03/10 08:59
 
かかしです、こんにちは。

>          なむnomotoです  

おはようございます。
ついでですので、回答です。

>  hoge xxxnnnxxmmdd hoge hhhkjhg.
>
> なんて行の、「2回目だけヒットする」と云うような
> 書き方はあるんでしょうか?
>
> それと、4桁の年号"1987"のような書き方は、perlに
>
>  \d{4} または、[12]\d{3}

 hidesoft.2:05258 とそれに続くスレッドを参照して下さい。
普通の秀丸の正規表現用のDLLでは対応していなかったと思います。


---かかし

[ ]
RE:01172 前後行取得grepNo.01180
ENCODINGSHIFTJIS さん 00/03/10 10:54
 

>
>if(!result){menu "行番号頭出し失敗");endmacro }
>if(!result){menu "行番号頭出し失敗";endmacro }
 ) はゴミです 取る。 
>
> 秀丸用のがあるんですか?
『 秀まるおのホームページへ 』 / 秀丸エディタのマクロライブラリ に載ってい
ます。
.DLL を2種導入します。

−−−ではモードをより縮退して、「ソースを全然読まない人」用のを作りましょう。

手動操作 単GREP 版
置換で 検索文字列→[検索文字列] とする。
別名で保存
DOS窓>FC/N TEXT1 TEXT2 >GREP3.TXT

FC/? で説明が出ます。

縮退マクロ 版 −−何行くらいまでなら扱えるか?
changename "";
gofiletop
#y=0;
while(1){
beginsel
left;searchdown "#i";// 手で書き替え
if(!result)break
golinetop2 left;
golinetop2
if(#y!=y)delete else escape; // 行の密着
golineend2 right;
golineend2 right;
   #y =y;
golineend2 right;
 }
escape;
right; golineend2 right;
beginsel
gofileend
delete
// これを読んでカーソルの動きをイメージしてください。

__E__













[ ]
RE:01179 前後行取得No.01181
きいろいまふらあ さん 00/03/10 12:13
 
>>  \d{4} または、[12]\d{3}
>普通の秀丸の正規表現用のDLLでは対応していなかったと思います。

厳密に同値かどうかはわかりませんが
[0-9][0-9][0-9][0-9]
または
(1|2)[0-9][0-9][0-9]
じゃだめ?
あ、5桁以上にマッチしちゃいけないのか。

置換なら可能。
[^0-9]\f[0-9][0-9][0-9][0-9]\f[^0-9]
 ↓
\0hoge\2
または
[^0-9]\f(1|2)[0-9][0-9][0-9]\f[^0-9]
 ↓
\0hoge\2

[ ]
RE:01180 前後行取得grepNo.01183
なむnomoto さん 00/03/10 14:42
 

 ENCODINGSHIFTJISさん、
             なむnomotoです

>> 秀丸用のがあるんですか?
>『 秀まるおのホームページへ 』 / 秀丸エディタのマクロライブラリ に載ってい
>ます。
>.DLL を2種導入します。

 んでは、早速私も、
 正規表現パワーアップDLL(BRegIf.DLL) Arimac 1999/11/20を
 入れさせて頂きました。(hidemaru dir に解凍しただけですけど)
  2種類(解凍したらもう一つで、計3個lzh)を解凍しました。

んで、前後行取得マクロ1 を実行しました。

 最初の行で、頻繁にカーソルがフラッシュしている状況は同じです。
 改善されません。

次に、前後行取得マクロ2 を実行しました。

> ) はゴミです 取る。 
                  取りました。

 最初の行末でカーソルが止まり、
                行は進んでる?
 と小さなmenuがでてます。
 これだけです。行は9行用意してあるんですが、最初の行末で
  進んでいません。??????これで良い?


>// 次の末尾書出しもしていない?

 はい、書出してません。

>−−−ではモードをより縮退して、「ソースを全然読まない人」用のを作りましょう。

   とへへ、申し訳ないです。ソースは、ほんの少々しか解りません。

>DOS窓>FC/N TEXT1 TEXT2 >GREP3.TXT

   出来ました。これは、2つのファイルの比較照合ですね。
   元ファイルとの比較でなく(ファイルが違いすぎます)、
   grep結果ファイル同士の比較ですね。
   どなたかの、ファイル比較マクロがあるエンジン部分が
   この部分 dos>Fc だったように覚えています。

>縮退マクロ 版 −−何行くらいまでなら扱えるか?

>// これを読んでカーソルの動きをイメージしてください。

  ううう、イメージできません。も少し説明を。(・_;)


[ ]
RE:01177 前後行取得No.01184
なむnomoto さん 00/03/10 14:47
 

 きいろいまふらあ さん
               なむnomotoです

>その辺の感覚を磨かれた方がよいですよ。

  磨いている積もりなんですが、だんだん曇ってる(・_;)

>とりあえず、秀丸の実装している正規表現がどんな仕様になっているか、
>ヘルプをお読みになって下さい。
>ヘルプの記述が理解できなければ読解のお手伝いはしますが。
>
>#一部ヘルプの通りでなかったりすることもあるかもしれませんけど。
>
>かの斉藤秀夫さんもおっしゃってます。
>「ただしヘルプくらいはちゃんと読んでください。」
>

  ありがとうございます。
  書いてある場所を見つけました。マクロヘルプばかり探して
  見えなかった(^^;)
  コピーして、ファイルを作りました。で、かかしさんのご説明
  は、なんとか確認できたような感じです。

[ ]
RE:01181 前後行取得No.01185
なむnomoto さん 00/03/10 15:00
 

             なむnomotoです


>厳密に同値かどうかはわかりませんが
>[0-9][0-9][0-9][0-9]
>または
>(1|2)[0-9][0-9][0-9]
>じゃだめ?

 なるほど。
  [0-9]+ や (1|2)[0-9]+ でも同じかな?

>あ、5桁以上にマッチしちゃいけないのか。
>
>置換なら可能。
>[^0-9]\f[0-9][0-9][0-9][0-9]\f[^0-9]
> ↓
>\0hoge\2
>または
>[^0-9]\f(1|2)[0-9][0-9][0-9]\f[^0-9]
> ↓
>\0hoge\2

 ↓
\t \1\. とすると、"\t (1|2)[0-9][0-9][0-9]."で、
 年号の前に、タブ 半角スペース が入り、直後に"."が入る
 訳ですね。(^o^)

 2つ目にヒットするって記入方は、正規表現強化.dLLでも
 駄目でしょうか。

 

[ ]
RE:01176 前後行取得No.01186
なむnomoto さん 00/03/10 15:13
 

            なむnomotoです

>> されません。 行末の\nに、ぴたっと検索ヒットしま
>> せんけど、これで良いのですよね。
>
>じゃなくてさーーーーーーーーーー。(-_-;
>かかしさんのマクロはぴたっと検索ヒットするでしょ?行頭でない\nに。

  検索で、文末\nの直前の文字を引っかけていませんか?
  ですから、置換ではその文字が削られるって心配があります。
  実際には、置換でも問題ないようですけど。・・・・

>#01174の件(行頭でないhogeの検索)も同じ考え方でできるはず。
>トライしてみては如何?>なむnomotoさん

 やってみます。  

>文言通りに解釈して下さい。
>深い意味や思いはありません。
>
>ちょっとガラが悪くてすみません。

 いえいえ、とんでもない。
 なんか変な深読みしてることは無いのですが、正規表現で、
 失敗すると、変な深読みするような感じになってしまったかも
 しれないです。私の表現も、おかしいのかも知れない。反省。

[ ]
RE:01179 前後行取得No.01187
なむnomoto さん 00/03/10 15:18
 
 

          なむnomotoです  

> hidesoft.2:05258 とそれに続くスレッドを参照して下さい。
>普通の秀丸の正規表現用のDLLでは対応していなかったと思います。

 ありがとうございます。わかりました。
 hidesoft.2:05258 ですね。

[ ]
RE:01186 前後行取得No.01188
かかし さん 00/03/10 15:52
 
かかしです、こんにちは。


>            なむnomotoです

こんにちは。

>>じゃなくてさーーーーーーーーーー。(-_-;
>>かかしさんのマクロはぴたっと検索ヒットするでしょ?行頭でない\nに。
>
>  検索で、文末\nの直前の文字を引っかけていませんか?
>  ですから、置換ではその文字が削られるって心配があります。
>  実際には、置換でも問題ないようですけど。・・・・

このマクロですよね。↓
直前の文字は引っかからないようになってますが・・・。
ソースを読むとわかると思いますが、、

#おせっかいかな。

//   行末の改行コードを探すマクロ
//   2000.03.06  
//

//↓"\n"だけを探す。
 searchdown "\n" ,regular;

//↓検索した結果、カーソル位置が 0 にあったら
//  行頭の"\n"なので飛ばす。
 while(x == 0){
  searchdown "\n" ,regular;
  if(!result){
   beep;
   break;
  }
 }

endmacro;

ということなので、直前の文字には、ひっかからないと思うのですが
どのような現象なのでしょう?

---かかし

[ ]
RE:01188 前後行取得No.01189
きいろいまふらあ さん 00/03/10 19:23
 
まふです。

>#おせっかいかな。

おせっかいなのは私ですって。(^^;

> while(x == 0){

ここを
while(linelen == 0){
か、あるいは
while(column == 0){
にすると、折り返してたまたま画面の左端にいる改行にヒットします。
#2番目の方が素直でしょうね。

[ ]
RE:01185 前後行取得No.01190
きいろいまふらあ さん 00/03/10 19:23
 
まふです。
末広がりなスレッドになってる?
#メールなんで各個撃破。全体が見えてない。そろそろ撤退モードかな。(^^;

>  [0-9]+ や (1|2)[0-9]+ でも同じかな?

1や12や123にもヒットしますが、いいですか?

>\t \1\. とすると、"\t (1|2)[0-9][0-9][0-9]."で、
> 年号の前に、タブ 半角スペース が入り、直後に"."が入る

ぴんぽん。
ただし年号でなくても入ります。

[ ]
RE:01183 前後行取得grepNo.01194
ENCODINGSHIFTJIS さん 00/03/13 11:45
 
> んでは、早速私も、
> 正規表現パワーアップDLL(BRegIf.DLL) Arimac 1999/11/20を
> 入れさせて頂きました。(hidemaru dir に解凍しただけですけど)
>  2種類(解凍したらもう一つで、計3個lzh)を解凍しました。

読み込み不足では? .DLL は2種です。ゆっくりページを
印刷でもして、マーカーでもマークして導入してください。

>次に、前後行取得マクロ2 を実行しました。
マクロ変更のヒントも マクロ2のページにもう一つ隠れています。

>   出来ました。これは、2つのファイルの比較照合ですね。
>   元ファイルとの比較でなく(ファイルが違いすぎます)、
いえ、元ファイルと、それを置換で別名保存したファイルの比較です。

>>縮退マクロ 版 −−何行くらいまでなら扱えるか?
>  ううう、イメージできません。も少し説明を。(・_;)
では、各行間に menu "step 123";文を全部挿入して
下さい。123 の部分はナンバリングです。
それを実行します。ほぼstep実行になります。

マクロは作れなくとも読めたほうが話が早いです。


[ ]
RE:01194 前後行取得grepNo.01197
なむnomoto さん 00/03/13 23:50
 
                   なむ野本です

>> んでは、早速私も、
>> 正規表現パワーアップDLL(BRegIf.DLL) Arimac 1999/11/20を
>> 入れさせて頂きました。(hidemaru dir に解凍しただけですけど)
>>  2種類(解凍したらもう一つで、計3個lzh)を解凍しました。
>
>読み込み不足では? .DLL は2種です。ゆっくりページを
>印刷でもして、マーカーでもマークして導入してください。

bregexp.lzh  bregif.lzh  soc.lzh    BREGEXP.H  BREGEXP.DLL  BREGE
XP.LIB  README.TXT  Jre32.dll
Jre32.c    Script1.rc  Jre32.def  Jre32.mak
resource.h

 が出てきました。必要なのは、DLL2種。あとは不要?
 とにかく全部、hidemaru dir にコピーしました。
 これでは、だめ?あっそうか、README.TXT を読むんでした。
 Jre32.DLLが重複したらあかんですね。
 *困った、私のJRE32.DLLが欠かせない。->取りあえず別名保存

 前後行1.mac実行: 1lineカーソル頻繁フラッシュ状態に変化なし。
                #何が悪いの???-->ワテ?

>>次に、前後行取得マクロ2 を実行しました。
>マクロ変更のヒントも マクロ2のページにもう一つ隠れています。

 どこだかなぁ(^^;) ? endmacro?
  "行は進んでる?" が1行目の行末に出て、動きません。
          マクロは実行中です。

>>   出来ました。これは、2つのファイルの比較照合ですね。
>>   元ファイルとの比較でなく(ファイルが違いすぎます)、
>いえ、元ファイルと、それを置換で別名保存したファイルの比較です。

 違いすぎませんか?と云いつつ、 実行。
 出来たファイルは、「同期がとれません。ファイルが違いすぎ」
 なんてあって、とても、前後行取得情報ではないですね。
 grep結果1行目の前後は確かにあるんですが、2行目は?
  ##このfc /n は、一体何をしようとしてるのか解りません。
   ううむ、やっぱ前後行取得はQgrepかナ〜。

>>>縮退マクロ 版 −−何行くらいまでなら扱えるか?
>>  ううう、イメージできません。も少し説明を。(・_;)
>では、各行間に menu "step 123";文を全部挿入して
>下さい。123 の部分はナンバリングです。
>それを実行します。ほぼstep実行になります。

  step 1  step 2  step 3・・・・・・ステップメニューは出ます。
  ファイルエンドまで行って、最初の行末まで戻り、
 行頭に行ったり、行末に行ったり来たりで、最初の行から、
 行は進行しません。一向に進む気配なし。

>マクロは作れなくとも読めたほうが話が早いです。

 カーソルの動きは大体解りましたが.......



[ ]
RE:01190 前後行取得No.01198
なむnomoto さん 00/03/14 00:05
 
         なむnomotoです

>末広がりなスレッドになってる?
>#メールなんで各個撃破。全体が見えてない。そろそろ撤退モードかな。(^^;

  本題とそれてます?(すご〜く<---自分)


>>  [0-9]+ や (1|2)[0-9]+ でも同じかな?
>
>1や12や123にもヒットしますが、いいですか?

  やっぱ、いけません。(^^;)

>ぴんぽん。
>ただし年号でなくても入ります。

  そうですが、他に手がかりがないので、あとはjperlか、
  手動ですね。(・_;)

[ ]
RE:01198 前後行取得No.01200
きいろいまふらあ さん 00/03/14 09:11
 
まふです。

>>ただし年号でなくても入ります。
>  そうですが、他に手がかりがないので、あとはjperlか、
>  手動ですね。(・_;)

jperlも年号かどうかの判断はできないと思います。
秀丸でも「桁数を制限しての置換なら可能」であることは
もう理解していただけてますよね?

[ ]
RE:01197 前後行取得grepNo.01201
ENCODINGSHIFTJIS さん 00/03/14 10:16
 
>
> 前後行1.mac実行: 1lineカーソル頻繁フラッシュ状態に変化なし。
>                #何が悪いの???-->ワテ?
もう一度画面からマクロソースを取り直してください。
searchdown がおかしくとも golineend2 right; で行lが進まないのはだめです;

>>>次に、前後行取得マクロ2 を実行しました。
>>マクロ変更のヒントも マクロ2のページにもう一つ隠れています。
regular を使わない記述もありますね。(.DLL 導入しなくても
よかったかも)気長に探して下さい。

>>>   出来ました。これは、2つのファイルの比較照合ですね。
>>>   元ファイルとの比較でなく(ファイルが違いすぎます)、
>>いえ、元ファイルと、それを置換で別名保存したファイルの比較です。
>
> 違いすぎませんか?と云いつつ、 実行。
> 出来たファイルは、「同期がとれません。ファイルが違いすぎ」
> なんてあって、とても、前後行取得情報ではないですね。
> grep結果1行目の前後は確かにあるんですが、2行目は?
>  ##このfc /n は、一体何をしようとしてるのか解りません。
>   ううむ、やっぱ前後行取得はQgrepかナ〜。
FCコマンドを使う例では grep面を使用するとは一言も書いてませんよ。
文章の読み込み不足です。文脈の転換に注意します。

>>>>縮退マクロ 版 −−何行くらいまでなら扱えるか?
>>>  ううう、イメージできません。も少し説明を。(・_;)
>>では、各行間に menu "step 123";文を全部挿入して
>>下さい。123 の部分はナンバリングです。
>>それを実行します。ほぼstep実行になります。
>
>  step 1  step 2  step 3・・・・・・ステップメニューは出ます。
>  ファイルエンドまで行って、最初の行末まで戻り、
> 行頭に行ったり、行末に行ったり来たりで、最初の行から、
> 行は進行しません。一向に進む気配なし。
マクロソースを手で打ち込んでません?ダメです。
webページをマウスで選択コピー貼り付けで取ります。
打ち込みとしても、これくらいの文字数はこなせないとやって行けません。

マクロ動作は、ファイルエンドまで行くと
searchdown が失敗して if(!result)break によりループを抜けます。

__E__


[ ]
RE:01200 前後行取得No.01202
なむnomoto さん 00/03/14 15:32
 
                なむnomotoです


>jperlも年号かどうかの判断はできないと思います。
>秀丸でも「桁数を制限しての置換なら可能」であることは
>もう理解していただけてますよね?

  少しくらいは、理解させて頂いてる積もりです(^^;)
  4桁数字が他にあって、難渋してます。
                                    ---->データ直し。
    \t\s1876. をexcelから戻すと、\s \. が無くなってる。
  アンカーが\tだけですが、こちらはなんとかなりました。

[ ]
RE:01201 前後行取得grepNo.01205
なむnomoto さん 00/03/15 00:14
 
  ENCODINGSHIFTJISさん
                    なむ野本です

>> 前後行1.mac実行: 1lineカーソル頻繁フラッシュ状態に変化なし。
>>                #何が悪いの???-->ワテ?
>もう一度画面からマクロソースを取り直してください。
>searchdown がおかしくとも golineend2 right; で行lが進まないのはだめです;

  //のある初行から、最後までコピーして張り付けでやってんですが、
  現象は同じです。
  「行lが進まないのはだめです;」ってことは、進むんですね。
   ################# なんで?
  #01169 遠距離デバッグが、前後行取得2マクロなんですが、
  どこが何だか解りません。
  行は進んでますか? が、1行目の最後に出たきり動きません。

>FCコマンドを使う例では grep面を使用するとは一言も書いてませんよ。
>文章の読み込み不足です。文脈の転換に注意します。

  んで、FC /N はファイル比較で GREPじゃないようですが。
  秀丸でGREPした画面と、置換した画面のファイルを比較するんじゃ
  同じだから意味ないし。
   次の、//縮退マクロ 版 −−何行くらいまでなら扱えるか?
  も、巧く行かないし、menu "step 1";〜も巧く行かないし、
  これは、step 4  と  step14 を行き来してますね。

>マクロソースを手で打ち込んでません?ダメです。
>webページをマウスで選択コピー貼り付けで取ります。
>打ち込みとしても、これくらいの文字数はこなせないとやって行けません。

  ドラッグ+コピー+ペーストでマクロファイルにしてと、同じですね。
  違いません。

>マクロ動作は、ファイルエンドまで行くと
>searchdown が失敗して if(!result)break によりループを抜けます。

  ファイルエンドまで行かないですね。初行で
  文頭と文末をstepが行き来してます。ループを抜けません。
       ###############どうして? 私には難問だわ。

 ええと、きいろいまふらあさんや、かかしさんは、巧く動きますか?
      ### きっと動いているんだワナぁ〜

[ ]
RE:01169 前後行取得grepNo.01206
きいろいまふらあ さん 00/03/15 10:17
 
まふです。

>//しかし golinend2 right; があるから少なくとも行は進むはず。

>golineend2 right; // 次行に

確認ですが、なむnomotoさんとこの動作環境→カーソル→高度なカーソルの中の
「行末<->次の行のカーソル移動の禁止」はどうなってますか?

movetolineno 1, lineno + 1;

で問題ないみたいですが?>ENCODINGSHIFTJISさん
#昔は問題あったんですが。

[ ]
RE:01206 前後行取得grepNo.01207
ENCODINGSHIFTJIS さん 00/03/15 11:01
 
>movetolineno 1, lineno + 1;
>
>で問題ないみたいですが?
>#昔は問題あったんですが。

表示の設定に足をすくわれるとは、考えつきませんでした。
相対移動で陽に行や桁を指定するのは煩わしかったので、
eof で!result が返るのも使っていた。

データ処理的(表示がかかわらない)なマクロでは論理行ベースの
動作モードを一時的に指定できるといいのですが。
スクリプト言語のソフトを秀丸に書き替えるときにも気を使わずにすむ。

では「貼り付け後のカーソル位置」や
「タブ文字の上にカーソル移動した時」「上書きモード時のリターン」
「単語の検索で...」「フリーカーソル位置で...」
「改行するとき空白だけの行....」「禁則レベル??」
全部考えるのはできないですね。result も合わせて?
多様な動作設定ができるのは良いのだが、改行で区切られた
文字列という見方でデータ処理するときは引っ掛かることもある。

エディタだからしょうがないか __E__




[ ]
RE:01206 前後行取得grepNo.01208
なむnomoto さん 00/03/15 14:23
 

                     なむnomotoです

>確認ですが、なむnomotoさんとこの動作環境→カーソル→高度なカーソルの中の
>「行末<->次の行のカーソル移動の禁止」はどうなってますか?

  確認しました。off です。
  ver 3.01

>movetolineno 1, lineno + 1;
>
>で問題ないみたいですが?>ENCODINGSHIFTJISさん
>#昔は問題あったんですが。

  前後行2マクロをこのようにしたら、クリックするごとに
 ”行は進んでる?”
 が、次行次行と下りて行きます。ただし行頭です。
   ここの事じゃないのかな(^^;)

if(!result){menu str(#lnoary[#c]),"番号#ERR";endmacro }
#c=#c+1;
movetolineno 1, lineno + 1;  // <---ここ
//golineend2 right; // 次行に
menu "行は進んでいる?";

[ ]
RE:01188 前後行取得No.01209
なむnomoto さん 00/03/15 14:38
 

            なむnomotoです

>このマクロですよね。↓
>直前の文字は引っかからないようになってますが・・・。
>ソースを読むとわかると思いますが、、

 いやぁ、マクロでは良いです。が、通常の検索では、
 つまり、空行以外の改行\nにピタッと検索ヒットする
 記入方は無いんですよね。
 置換では、.*\f\n で指定できる。ってことですよね。


 テーマを振ります(^^;)
 空行の連続を置換する場合だと、
  ^\n\n
  で指定できますが、空行2つ以上連続って書き方は
 できますか?。
  perl で、^\n{2,} では駄目でした。
  秀丸では、 \n\n\n+ では駄目ですね。
 


[ ]
RE:01209 前後行取得No.01210
きいろいまふらあ さん 00/03/15 15:34
 
>  で指定できますが、空行2つ以上連続って書き方は
> できますか?。

まずヘルプを読みましょう。
「\nを使った複数行検索の際の制限について」

個数の上限を決めてやれば理論的には可能、なはず。
#検索文字列用のバッファの大きさに依存、かな?

例:連続する2個から4個の改行を1個の改行に置換
\n\n\n?\n?

\n

マクロを使ってreplaceallをresult == falseになるまで
回してやるって手はあります。

[ ]
RE:01205 前後行取得grepNo.01211
ENCODINGSHIFTJIS さん 00/03/15 16:13
 

気分転換に SED 版も作りました。秀丸をマスターしたら試してください。

-------------- 3.sed ---------
# -n で実行
# まるでパズル、修得してもメリット少ないです。
# SED は全置換専用かな

# 現行がヒットなら前行を出力
/検索文字列/{x;=;p;b}
# ヒットしないなら前行を検査
    x
/検索文字列/{p;s/.*//;;x;p;b}
#検索文字列
# 空も改行する?
# 元面の最終はダミーの空白行のこと
# 行番号の出方はずれる

// ------------------- 実行例
15:52 C:\Windows\TEMP d:\sed118\sed.exe -n -f 3.sed 3.sed
6
# 現行がヒットなら前行を出力
/検索文字列/{x;=;p;b}
# ヒットしないなら前行を検査
9
    x
10
/検索文字列/{p;s/.*//;x;p;b}
#検索文字列
# 空も改行する?

縮退のマクロには後ろの行が出ない事があるバグがあります。
しかし、動かすのが先だから直すのは後回しにします。

sed 版を作っていて気がついた、自分の使わないのは集中力無し。

__END__

[ ]
RE:01208 前後行取得grepNo.01212
ENCODINGSHIFTJIS さん 00/03/15 16:31
 
一つ前進しましたが、まだ先に何か出るかもしれないし。
とりあえずの対応としては、私のマクロを実行する時は
秀丸の動作設定を
win 付属のメモ帳(notepad.exe)と同様な物にしておいて下さい。

短いデータでマクロが完了するまで進めましょう。

それにしても FC/N 版はどうですか?

__END__


[ ]
RE:01212 マクロ動作の互換保証の枠組みNo.01213
ENCODINGSHIFTJIS さん 00/03/16 11:56
 
TABを使う、自動インデント、フリーカーソル、要素は数多い、
マクロの動作保証の枠組みを秀丸側でも考えてほしいものだ。

設定を通知して手で変更する。どう考えてもサイバー時代じゃない。
レジストリを一時書き替えてマクロ実行しても、戻しは秀丸側で
サポートしてくれないと。

lockhidemaruENV  // 以降設定を替えてマクロ実行してもendmacroで戻る

あるいは、データ処理用のモードを一時的に設定できる。
スクリプト言語と同様な文字列の扱いになるようなカーソル。

runmode 0;

// 今回のマクロの動作検証テストのマクロ
// 動作環境はマクロ対象の物と同じこと
//
gofiletop
insert "0123456789";insertreturn
insert "01234567890";insertreturn
insert "012345678912";insertreturn
insert "0123456789";insertreturn
menu "テストデータ4行の末尾ですか?";
gofiletop menu "文書先頭です";
golineend2 menu "行末です";
right; menu "2行目の頭です";
golineend2 menu "行末です";
right; menu "3行目の頭です";
left;  menu "2行目の行末です";

__E__

[ ]
RE:01211 前後行取得grepNo.01215
なむnomoto さん 00/03/17 21:36
 
                        なむ野本です

>気分転換に SED 版も作りました。秀丸をマスターしたら試してください。

 ひえ! SEDは使った事無いです。


>縮退のマクロには後ろの行が出ない事があるバグがあります。
>しかし、動かすのが先だから直すのは後回しにします。

  うう、当方では全く行が出てません(^^;)
  大体、縮退マクロが何をしようとしているのかも
  解りません。申し訳ないです。

[ ]
RE:01212 前後行取得grepNo.01216
なむnomoto さん 00/03/17 21:40
 

  遅くなりまして。 なむnomotoです

>一つ前進しましたが、まだ先に何か出るかもしれないし。
>とりあえずの対応としては、私のマクロを実行する時は
>秀丸の動作設定を
>win 付属のメモ帳(notepad.exe)と同様な物にしておいて下さい。

 うう(^^;)、秀丸デフォルト状態ですか?

>短いデータでマクロが完了するまで進めましょう。

 実験ファイルは短いんです。


>それにしても FC/N 版はどうですか?

  text1 text2 が何を指しているか解りません。
  FC  /N は やってみたんですけど。


[ ]
RE:01216 前後行取得grepNo.01217
ENCODINGSHIFTJIS さん 00/03/17 22:41
 
>  text1 text2 が何を指しているか解りません。
>  FC  /N は やってみたんですけど。
>
22:28 C:\WINDOWS\TEMP FC/N TEXT1 TEXT2
ファイルを比較しています : TEXT1 と TEXT2
****** TEXT1
     2:  LINE2 SKJFHKAJF
     3:  LINE3 SKFJ検索文字列HSAKF
     4:  LINE4 SKFAKFLAAL
****** TEXT2
     2:  LINE2 SKJFHKAJF
     3:  LINE3 SKF<検索文字列>HSAKF
     4:  LINE4 SKFAKFLAAL
******

あなたの望んでいる形より2倍の分量になるだけです。
元の方を除去するマクロは容易でしょう。
__e__

[ ]
RE:01217 前後行取得grepNo.01218
ENCODINGSHIFTJIS さん 00/03/18 09:03
 
これまでの話しでマクロに関しては終わっているから、縮退モードを進めて行きまし
ょう。

FC/N版の出力結果を望む形に近づけるキーマクロでも作りましょう。
手順
ファイル比較結果を秀丸で開く
***** を検索する
ファイルの頭にカーソルを戻す
キー記録開始
下候補
1文字選択(開始)
下候補
1行下に
削除
下候補
キー記録終了

これでキー再生を文書末尾まで繰り返す。
頭で考えただけで秀丸で実行確認してないが、方向はこんなもの。

「マクロ動作の移植性を確保するしっかりした仕組みが確立」してない
のだから仕方ないですね。なむnomoto 環境で動作させるための書き換えの
ヒントはこれまでの議論で見えているのですが、
マクロがわかるだけが人生じゃないさ。

__e__

[ ]
RE:01217 前後行取得grepNo.01219
なむnomoto さん 00/03/22 01:28
 
                            なむnomotoです

>>  text1 text2 が何を指しているか解りません。
>>  FC  /N は やってみたんですけど。
>>
>22:28 C:\WINDOWS\TEMP FC/N TEXT1 TEXT2
>ファイルを比較しています : TEXT1 と TEXT2

 このTEXT1 と TEXT2 は何か、が解ってません。
 GREP検索の結果ではないと、云われましたから、
 何だかサッパリです。結果ファイルの検索文字を
 < > で囲んだのをTEXT2にするんですか?


>****** TEXT1
>     2:  LINE2 SKJFHKAJF
>     3:  LINE3 SKFJ検索文字列HSAKF
>     4:  LINE4 SKFAKFLAAL
>****** TEXT2
>     2:  LINE2 SKJFHKAJF
>     3:  LINE3 SKF<検索文字列>HSAKF
>     4:  LINE4 SKFAKFLAAL
>******
>

 んで、検索行の前後行が抜き出しになるとも思えないし、
 思考力ほぼ0の私にはサッパリです。
 置換でもよく分かってないのだから。

[ ]
RE:01219 前後行取得grepNo.01220
きいろいまふらあ さん 00/03/22 09:12
 
もしも、なむnomotoさんが、サブジェクトにだまされて話を混同しているのなら、
それは、話題が変わるのにサブジェクトを付け直さなかった報いでは?
などと邪推しながら横から失礼します。きいろいまふらあです。

>>>  text1 text2 が何を指しているか解りません。

なむnomotoさんは何かと何かを比較して違いを見つけたいんですよね?
ひとつめの何かがtext1(というファイル)
ふたつめの何かがtext2(というファイル)ですよね。

>>>  FC  /N は やってみたんですけど。

「やってみさんですけど」って、何をやったの?

> このTEXT1 と TEXT2 は何か、が解ってません。
> GREP検索の結果ではないと、云われましたから、

なんでここでgrepの話が出てくるの?

なむnomotoさんは一体全体何をしたいんですか???
#くどい?(^^;

> んで、検索行の前後行が抜き出しになるとも思えないし、

自分で試してみました?ほんとに。

DOS窓で"FC /?"と打ってみてください。
#打つだけじゃなくて、出力を読んでね。

[ ]
RE:01220 前後行取得grepNo.01221
なむnomoto さん 00/03/22 14:28
 
                       なむnomotoです

>もしも、なむnomotoさんが、サブジェクトにだまされて話を混同しているのなら、
>それは、話題が変わるのにサブジェクトを付け直さなかった報いでは?

 そうなんですね。半可通には難しいですね。徐々に変わって行くんだもの。(^^;)
 前後行取得グレップで希望したのは、
  検索文字"単語"を入れると、検索ヒットした時にその前後行共に引き出せるマクロ
  はあるんかな?という、今となってははかない希望でした。
  Qgrepがあるので、これを使ったら?という アドバイスでした。そうしました。

>「やってみさんですけど」って、何をやったの?
 :
>自分で試してみました?ほんとに。
>
>DOS窓で"FC /?"と打ってみてください。
>#打つだけじゃなくて、出力を読んでね。

  私、疑われてますね (こないだ税務署員にも <--関係ない!)
 13000行あるファイルの比較です。2行の違いが見つかりました。
 FC /? については、dosのリファレンスbookにもあって、同じ事が
 書かれてあります。つまりファイルの比較ですね。
 出力が前後1行ずつ、付随して表示されます。
 ファイル比較には、どなたかメモしてないのですが、秀丸マクロがあります。
  非常に高速で結果が得られます。
//--------Filecomp.mac-----------------------------------//
$file_1 = filename;
setactivehidemaru 1;
$file_2 = filename;
setactivehidemaru 1;
$file_3 = hidemarudir + "\\fckekka.txt";
runsync "fc /n " + $file_1 + " " + $file_2 +" > " + $file_3;
openfile $file_3;
endmacro;
//-------------------------------------------------------//
   //ransync2 じゃなくても使えるんだ。

 これを、前後行取得に使えるなら、検索語を入れて、その前後行が
 引き出せれば良いのですよね。

>なむnomotoさんは一体全体何をしたいんですか???
>#くどい?(^^;

 長いツリーだけど、前後行取得grepがやりたいって初期目的は、
  まふさんが前線撤退されて、ENCODINGSHIFTJISさんのアドバイスは
  なんだかよく分からない状態が現状です。
  まふさんは、あのマクロ動いてます?
      私は感覚が磨けるどころか段々錆び付いてしまっている。

 あらかじめ検索ファイルをコピーして(この場合1file3MB)、検索語
 を、<>付きに置換して、元ファイルと置換ファイルを比較すれば、
 前後行が引き出せるってことなら解るのですが、そのようには書かれて
 ないようだし。<>付きにするのは、面倒な作業でQgrepにかなわない。
 FCでは、前後行は3行ずつとか、前2行・後4行付随なんてのは無理ですね。

 Qgrepにもひけを取らないような前後行取得grepがあると良いんですけど。
 ま、無くても人生暗闇じゃないから良いような気もするけど、秀丸は、
 これが苦手なんでしょうかね。

[ ]
RE:01218 前後行取得grepNo.01223
なむnomoto さん 00/03/22 14:55
 

                なむnomotoです

>FC/N版の出力結果を望む形に近づけるキーマクロでも作りましょう。

 分からず屋にも解るようにお願いします。

>手順
>ファイル比較結果を秀丸で開く

 ファイル比較結果は、何と何の比較結果なんでしょうか。
  #ここがサッパリ解らないです。

>***** を検索する
>ファイルの頭にカーソルを戻す
>キー記録開始
>下候補
>1文字選択(開始)
  #済みません。なぜ1文字選択を?
>下候補
>1行下に
>削除
  #済みません。なぜ削除を?
>下候補
>キー記録終了

 まだ、続きがあるんですよね。前後行取得の?。

>ヒントはこれまでの議論で見えているのですが、
>マクロがわかるだけが人生じゃないさ。

 うう、見えてません。

[ ]
RE:01221 前後行取得grepNo.01225
きいろいまふらあ さん 00/03/22 18:46
 
まふ%ちょっと反省モード。
混同してたのは私でしたね。

text1.txt というファイルの中のhogeをgrepしたいとき、
全てのhogeを[hoge]に置換して、これをtext2.txtとして保存。
で、DOS窓で FC/N text1.txt text2.txt すると、
前後行付で hoge のある行が抽出されると。

ただしこれでは text1.txt中の hoge のある行と、
text2.txt中の [hoge] のある行が抽出されてしまうので、半分はいらない。
で、後者を消してしまうキーマクロを作りましょう、ということですね。

ということで、

>  検索文字"単語"を入れると、検索ヒットした時にその前後行共に引き出せるマクロ
>  はあるんかな?という、今となってははかない希望でした。

見事にこれが実現されているわけですね。
#前後1行ずつしかないけど。

>>なむnomotoさんは一体全体何をしたいんですか???

今回はちと言い過ぎでした。ごめんなさい。

> 長いツリーだけど、前後行取得grepがやりたいって初期目的は、
>  まふさんが前線撤退されて、ENCODINGSHIFTJISさんのアドバイスは
>  なんだかよく分からない状態が現状です。
>  まふさんは、あのマクロ動いてます?

動作状況は前に書いたとおりです。
動いたり動かなかったりです。
マクロのロジック自体は正しいと思っているので、
tagjump/backtagjumpがうまく動くようになったら正式版にしようかな、
というところです。
ENCODINGSHIFTJISさんのサブルーチンを拝借して、とりあえず動くように
しちゃってもいいかな、と思っているところです。
#ということで、ある意味あれで完成です。
#細かい心配りはしてませんけど。

> あらかじめ検索ファイルをコピーして(この場合1file3MB)、検索語
> を、<>付きに置換して、元ファイルと置換ファイルを比較すれば、
> 前後行が引き出せるってことなら解るのですが、そのようには書かれて

そのまんまじゃないですか。(^^;

> ないようだし。<>付きにするのは、面倒な作業でQgrepにかなわない。

文字列を入力させて、前後を<>で括ったものに全置換。
手はそんなに動かさなくて済みますね。

> FCでは、前後行は3行ずつとか、前2行・後4行付随なんてのは無理ですね。

それは無理ですね。

[ ]
RE:01225 前後行取得grepNo.01232
なむnomoto さん 00/03/22 22:17
 

            なむnomotoです

>ただしこれでは text1.txt中の hoge のある行と、
>text2.txt中の [hoge] のある行が抽出されてしまうので、半分はいらない。
>で、後者を消してしまうキーマクロを作りましょう、ということですね。

  おおそうか、不要の行を削除するんですか。
        # やっと解ってる(^^;)
   要る行を消すなんて、どうしてかと思ったり・・・
  

>>  検索文字"単語"を入れると、検索ヒットした時にその前後行共に引き出せるマクロ
>>  はあるんかな?という、今となってははかない希望でした。
>
>見事にこれが実現されているわけですね。
>#前後1行ずつしかないけど。

 ところが、10万行ファイルを比較するので、秀丸では
 無理かという心配が徐々に盛り上がってきて、ついに意気消沈。
 #1ファイルに、<>を入れるだけで相当時間が喰う。
>
>>>なむnomotoさんは一体全体何をしたいんですか???
>
>今回はちと言い過ぎでした。ごめんなさい。

  時々、入れて貰えると、目覚ましになります。

>動作状況は前に書いたとおりです。
>動いたり動かなかったりです。
>マクロのロジック自体は正しいと思っているので、
>tagjump/backtagjumpがうまく動くようになったら正式版にしようかな、
>というところです。

  ううむ。私の設定でも使えると良いのですが。
  Qgrepのようなダイアログでできると画期的な
  感じもします。

>文字列を入力させて、前後を<>で括ったものに全置換。
>手はそんなに動かさなくて済みますね。

 この場合1file3MBなんで、時間が結構かかるんです。


[ ]
RE:01232 前後行取得grepNo.01234
ENCODINGSHIFTJIS さん 00/03/23 10:55
 
> この場合1file3MBなんで、時間が結構かかるんです。
>
最初の話でゆくと、秀丸の画面を3行表示に高さを低くして、検索すれば良いのでは?
N行の場合でも、下候補は画面天地中央で表示がそろいます。
上候補は第1行なので補正が必要ですが。

例えば
// 検索行位置を天地中央揃えに 上候補の補正
// 下候補は画面中央、上候補は1行目
// カーソルの画面上の位置を知る方法は?
//
#y=y; goscreentop #ytop=y; goscreenend #yend=y;
    #m=#y-(#ytop+#yend)/2;  // 移動量計算
if(#m < 0){goscreentop up -#m; finddown }

__END__

[ ]
RE:01232 前後行取得grepNo.01235
きいろいまふらあ さん 00/03/23 11:54
 
だんだん収束してきたかな。

>  ううむ。私の設定でも使えると良いのですが。

設定の問題ではないです。
我々にはいじれない秀丸内部の問題です、多分。
開発側での対応を待つ、という意味です。

>  Qgrepのようなダイアログでできると画期的な

ダイアログ→マクロサーバ。最近触ってなかった。
これを機に田楽サーバのお世話になりましょうか。
#と言ってみるだけです、今は。

>>文字列を入力させて、前後を<>で括ったものに全置換。
> この場合1file3MBなんで、時間が結構かかるんです。

それこそperlとか使ったらどうなんでしょ?

と振幅が変わってない気もする。(^^;

[ ]
RE:01234 前後行取得grepNo.01237
なむnomoto さん 00/03/23 14:51
 

               なむnomotoです

  # いろいろ有り難うございます。

 最初に欲しかったのは、誰でもこのデータを検索すると
 その検索ヒットした前後数行が1ブロックのように
 抜き出されてくるようなマクロが欲しかったんです。

 住所録のようなもので、6行構成で前後に空行があります。
 複雑な手順だと、誰でもとは行かず、使いにくいです。 

 Qgrepでは希望通りになりますです。
   #使い慣れないと、いけませんけど。(^^;)

 熟達者ENCODINGSHIFTJISさんのように、先を読んでやる
 なんてことがなかなかできなくて済みません。

>// 検索行位置を天地中央揃えに 上候補の補正
>// 下候補は画面中央、上候補は1行目
>// カーソルの画面上の位置を知る方法は?
>//
>#y=y; goscreentop #ytop=y; goscreenend #yend=y;
>    #m=#y-(#ytop+#yend)/2;  // 移動量計算
>if(#m < 0){goscreentop up -#m; finddown }
>

 このマクロは、何かに使えそうです。
  ちょっと使って見ます。

[ ]
RE:01235 前後行取得grepNo.01238
なむnomoto さん 00/03/23 15:03
 
              なむnomotoです   

>だんだん収束してきたかな。

 そうですね。mafu_Hgrepができそうですからね。

>設定の問題ではないです。
>我々にはいじれない秀丸内部の問題です、多分。
>開発側での対応を待つ、という意味です。

 そうなんですか、斎藤秀夫さんに作ってもらうしかないですかね。
 # 待てないぞと、云っておるもんが、ここに一人います。(^^;)

>これを機に田楽サーバのお世話になりましょうか。
>#と言ってみるだけです、今は。

    少し期待してます。
  # ENCODINGSHIFTJIS版Hgrepは、どうなんでしょ。

>それこそperlとか使ったらどうなんでしょ?
>
>と振幅が変わってない気もする。(^^;

 もともと、簡単に前後行取得grepができたらなぁという希望です。
 誰でも使えるようなのが。
 1回だけの処理なら、jperlも使わねばなりませんが、度々検索
 するには、相当面倒なことですね。ここがまあ、引っかかるとこ
 なんです。

 話題がアチコチに飛んで済みません。責任は私にあります。
 片方で、データ修正のための検索方法を聞いたり、grepが
 欲しいと云ったりで済みません。
 前後行取得の秀丸Hgrepがあれば、問題はほぼ解決します。
 # 私の半可通は、ほとんど解決してない(゚o。)☆\バキッ!


[ ]
RE:01237 前後行取得grepNo.01239
番頭++ さん 00/03/23 15:48
 
tree を変えました。

[ ]
RE:01237 前後行取得grepNo.01258
山紫水明 さん 00/03/26 17:10
 
    なむnomotoさん こんにちは。

》 最初に欲しかったのは、誰でもこのデータを検索すると
》 その検索ヒットした前後数行が1ブロックのように
》 抜き出されてくるようなマクロが欲しかったんです。

 どうも私のような者が口出しするのはちょっと場違いで気が引けますが。(^^;
前に作ったマクロをちょっと前後行を取得できるように改造してみました。
Grep に比べるとスピードの点で落ちますが,まあご参考になれば。

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

// ---------------- 検索行前後抽出.Mac ------------------------------- //
//
//          検索して行抽出,別ファイルに書き出し
//          クリップボード履歴が全部消去されるので注意。
//                                  1999.8.29   山紫水明
//                                       9.4    修正
//                                  2000.3.26   前後行取得
disabledraw;
disableinvert;
#Tn = 0;    //データ総数
#n = 0; //カウント用
#handle_1 = hidemaruhandle(0);
if( overwrite ) { overwriteswitch; #ows = 1; }
clearcliphist;      //クリップボード履歴の消去
if(selecting) copy;
    else copyword;
    beginclipboardread;     //クリップボードからの取り込み開始宣言
    $s = getclipboard;      //クリップポードから1行取り込み
$search = input("検索語を入れてください", $s);
if ( $search == "" ) endmacro;
setsearch $search, searchoption;
if(imestate){imeswitch; #switch = 1;}
#prev = val(input("前取得行数は? ", "1"));
#next = val(input("後取得行数は? ", "1"));
if(#switch) imeswitch;
newfile;
#handle_2 = hidemaruhandle(0);
setactivehidemaru #handle_1;
gofileend;
while (1) {
    findup;
    if (!result) {
    call Write;
    break;
    }else{
    #line = lineno;
    movetolineno 1, #line - #prev;
    beginsel;
    movetolineno 1, #line + #next + 1;
    copy;
    setclipboard "[" + str(#line) + " 行前後]";
    #Tn = #Tn + 1;
    #n = #n + 1;
    if (#n > 25) call Write;    //クリップボード履歴バッファの
    movetolineno 1, #line;      //大きさによりこの数字を変える
    }
}

$file = basename2;
setactivehidemaru #handle_2;
if( #ows ) overwriteswitch;
gofiletop;
insert $file + "\n";
insert "検索語 「" + $search + "」\n";
insert "検索個数は " + str(#Tn) + " です。\n";
endmacro;

Write:      //新ファイルに記入
setactivehidemaru #handle_2;
gofiletop;
insertreturn;
while(#n){
    poppaste;
    insertreturn;
    poppaste;
    insertreturn;
    #n = #n - 1;
}
backspace;          //最下行の改行マーク削除
setactivehidemaru #handle_1;
return;
// ----------------------------------------------------------- //


[ ]
RE:01258 前後行取得grepNo.01262
なむnomoto さん 00/03/27 17:24
 

  山紫水明さん
         なむnamotoです

> どうも私のような者が口出しするのはちょっと場違いで気が引けますが。(^^;
>前に作ったマクロをちょっと前後行を取得できるように改造してみました。
>Grep に比べるとスピードの点で落ちますが,まあご参考になれば。
>

  マクロをご提示頂き、有り難うございます。
  やってみました。
  別に新ツリーにしました。

[ ]