折りたたみで検索結果のみ表示することはNo.23896
tsuna7 さん 07/10/24 11:27
 
すべて折りたたみ状態で検索を行った場合に、
”ヒットした行のみ表示する”ということは出来るでしょうか?

Q&Aを一通り目を通してみましたが、
見つからなかったので質問します。

よろしくお願いします。

[ ]
RE:23896 折りたたみで検索結果のみ表示すNo.23898
秀丸担当 さん 07/10/24 12:39
 

>すべて折りたたみ状態で検索を行った場合に、
>”ヒットした行のみ表示する”ということは出来るでしょうか?

そういう表示方法は無いですが、がんばってマクロを作れば、ヒットした行だけ
を見えるような形で折りたたむことはできると思います。

アウトライン解析の枠を使えば、ヒットした行のみを枠内に表示させることがで
きます。

アウトライン解析の方法を「強調一覧」にして、『「検索文字列を強調」されて
いる箇所』だけをチェックしておくと、検索にヒットした文字が枠内に一覧表示
されるようになります。


アウトライン解析の方法を「ツリー表示」にしておくと、さらにいろいろできま
す。
既存の定義に追加して、見出しの定義を「強調表示」の『「検索文字列を強調」
されている箇所』にしておくと、見出しの1つとして検索にヒットした行を表示
できます。

見出しの定義で表示範囲を「行全体」にしておくと、枠の中の表示はご希望の表
示に近いかもしれません。

[ ]
RE:23898 折りたたみで検索結果のみ表示すNo.23901
tsuna7 さん 07/10/24 14:23
 
秀丸担当さん、ご返事ありがとうございます。

今の私のレベルではちょっと難しそうですが、
マクロを使えば出来ることが分かりましたので、
これから勉強して挑戦してみます。

誰か作ってくれないかな〜

[ ]
RE:23901 折りたたみで検索結果のみ表示すNo.23902
EXZS さん 07/10/24 15:46
 
>秀丸担当さん、ご返事ありがとうございます。
>
>今の私のレベルではちょっと難しそうですが、
>マクロを使えば出来ることが分かりましたので、
>これから勉強して挑戦してみます。
>
>誰か作ってくれないかな〜

簡単にこんな感じでどうでしょうか?
ファイルの先頭から検索し、検索文字が存在してもののみを残して
折りたたみます。
検索ダイアログがいったん出ますのでその検索条件を設定した後
下検索ボタンを押していただければ動作するはずです。

setcompatiblemode 0x03;
gofiletop;
beginsel;
find;
while(1){
 if(!result){
  break;
 }
 golinetop2;
 fold;
 golineend2;
 right;
 golineend2;
 right;
 beginsel;
 finddown;
}
gofileend;
fold;

[ ]
RE:23902 折りたたみで検索結果のみ表示すNo.23906
tsuna7 さん 07/10/25 09:28
 
EXZSさん、ありがとうございます。
早速、実行してみました。

最初に見つかった行の手前まで、
1行目を除いて折りたたみされていましたが、
1行目でループしているような動作がみられ、
以降の処理はされませんでした。

しかし、大変参考になりました。
マクロの勉強をかねて、
なぜ、ループしているのかを含め自分で調べてみたいと思います。

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

[ ]
RE:23906 折りたたみで検索結果のみ表示すNo.23909
秀丸担当 さん 07/10/25 09:58
 

EXZSさんの書かれたマクロは自分のところではうまくいっているようですが、も
しかしたら既存の折りたたみ状態によって不具合が起きてしまったりしているで
しょうか。
テストしていたら、disabledrawしているときにfoldallできないバグと、ファイ
ル先頭で二重に範囲選択して折りたたみしようとすると折りたたみ状態が壊れる
バグを発見してしまいました。
関係あるかどうかわからないですが、V7.04で修正しようと思います。

[ ]
RE:23906 折りたたみで検索結果のみ表示すNo.23910
EXZS さん 07/10/25 10:53
 
>EXZSさん、ありがとうございます。
>早速、実行してみました。
>
>最初に見つかった行の手前まで、
>1行目を除いて折りたたみされていましたが、
>1行目でループしているような動作がみられ、
>以降の処理はされませんでした。
>
>しかし、大変参考になりました。
>マクロの勉強をかねて、
>なぜ、ループしているのかを含め自分で調べてみたいと思います。
>
>ありがとうございました。

すみません、現状のマクロでは1行目に検索すべき文字がある場合
うまく働かないかもしれません。
1行目に検索文字がある場合もうまく結果を出そうとすると判断式など
必要になろうかと思います。

判断式はあったほうがよいですか?

あと1行目がループしてしまう症状は秀丸担当さんのレスにある
バグを修正すると直るかもしれません。本マクロは折りたたみ時の
カーソル移動に依存する部分があるので、そこが崩れると結果が
おかしくなる可能性があります。

[ ]
RE:23910 折りたたみで検索結果のみ表示すNo.23912
EXZS さん 07/10/25 11:03
 
先頭に検索文字がある場合の対策を入れてみました。

あと、先頭から最初の検索文字まで折りたたまれないのは
仕様なのでしかたがないのですが、先頭が折りたたまれて
いてなおかつ、先頭から検索文字までを折りたたもうとすると
表示が崩れるみたいですね。

setcompatiblemode 0x03;
gofiletop;
beginsel;
find;
while(1){
 if(!result){
  break;
 }
 golinetop2;
 if(lineno > 1){
  fold;
  golineend2;
  right;
 }
 golineend2;
 right;
 beginsel;
 finddown;
}
gofileend;
fold;

[ ]
RE:23912 折りたたみで検索結果のみ表示すNo.23914
tsuna7 さん 07/10/25 14:32
 
EXZSさん、ありがとうございます。
参考にさせていただき、自分なりに満足できるものが出来ましたので、
ご報告させていただきます。

以下のコードを"折りたたみ.mac"と言うファイル名で作成しました。
// test行 fold                  // 1行目にあるとき test //
setcompatiblemode 0x01;         // 折りたたみを一旦解除
setcompatiblemode 0x03;         // 折りたたみを維持に設定
gofiletop;                      // ファイルの先頭に移動
beginsel;                       // 範囲選択開始
find;                           // 検索ダイアログ
if(result == true){
    golinetop2;                 // 見つかった行の行頭に移動
    endsel;                     // 範囲選択モードを解除
    fold 0x0001;                // 選択範囲を折りたたみ
    down 1;                     // 見つかった行の下の行頭に移動
    while(1){
        beginsel;               // 範囲選択開始
        finddown;               // 下候補
        if(result == true){
            golinetop2;         // 見つかった行の行頭に移動
            endsel;             // 範囲選択モードを解除
            fold 0x0001;        // 選択範囲を折りたたみ
            down 2;             // 見つかった行の下の行頭に移動
// ??? 何故か1ではなく2を指定しないとちゃんと動かない ???
            if(code == eof){    // ファイルの最後?
                break;          // 終了
            }
        }else{
            gofileend;          // 下には無いのでファイルの最後に移動
            endsel;             // 範囲選択モードを解除
            fold 0x0001;        // 選択範囲を折りたたみ
// test行 fold                  // 続けてあるとき test //
            break;              // 終了
        }
    }
}else{
    message "search string not found";
}
endmacro;
// test行 fold                  // 最後の行にあるとき test //

このマクロ自体を使用し"fold"を検索したところ、
 1|// test行 fold                  // 1行目にあるとき test //
--------------------------------------------------------------
10|    fold 0x0001;                // 選択範囲を折りたたみ
--------------------------------------------------------------
18|            fold 0x0001;        // 選択範囲を折りたたみ
--------------------------------------------------------------
27|            fold 0x0001;        // 選択範囲を折りたたみ
28|// test行 fold                  // 続けてあるとき test //
--------------------------------------------------------------
36|// test行 fold                  // 最後の行にあるとき test //
37|[EOF]
と表示され、長年願っていた(30年前IBMのエディタで出来ていた)表示が出来ました。
これで仕事が楽になる〜

あと、折り込まれている行を最初または最後から
1行ずつ展開するマクロが出来れば完璧です。

皆さんのアドバイスがなければ作ることが出来ませんでした。
ありがとうございました。



[ ]
RE:23914 折りたたみで検索結果のみ表示すNo.23915
秀丸担当 さん 07/10/25 15:07
 

うまくいったようで、よかったです。
マクロ先頭に disabledraw; を書いておくと高速になっていいかもしれません。

[ ]