sakura-editor / sakura

SAKURA Editor (Japanese text editor for MS Windows)
https://sakura-editor.github.io/
Other
1.24k stars 162 forks source link

Grep実行結果に対してGrepを実行すると検索対象に存在しない行が検索結果に出力される #1936

Open musagi opened 1 year ago

musagi commented 1 year ago

問題内容

Grep実行結果に対してGrepを実行すると、Grep実行後に追加される検索条件と検索対象の行が検索結果に出力される。 Grep実行後に追加される検索条件と検索対象の行は検索対象とならないのが正しいと思われる。

再現手順

  1. サクラエディタを起動してhogeと入力する。
  2. 編集中のテキストから検索にチェックを入れて、hogeをGrep検索すると以下の検索結果が表示される。

    □検索条件  "hoge"
    検索対象       Window:[(無題)1  [UTF-8]]
    フォルダー       
    除外ファイル   
    除外フォルダー   
        (サブフォルダーも検索)
        (英大文字小文字を区別しない)
        (文字コードセットの自動判別)
        (一致した行を出力)
    
    :HWND:[00390b54](無題)1  [UTF-8](1,1)  [UTF-8]: hoge
    1 個が検索されました。
  3. 上記の検索結果に対して、編集中のテキストから検索にチェックを入れてhugaをGrep検索すると以下の検索結果が表示される。

    □検索条件  "huga"
    検索対象       Window:[ 【Grep】"huga"]
    フォルダー       
    除外ファイル   
    除外フォルダー   
        (サブフォルダーも検索)
        (英大文字小文字を区別しない)
        (文字コードセットの自動判別)
        (一致した行を出力)
    
    :HWND:[009409be](Grep)(16,9)  [UTF-8]: □検索条件  "huga"
    :HWND:[009409be](Grep)(17,28)  [UTF-8]: 検索対象       Window:[ 【Grep】"huga"]
    2 個が検索されました。

再現頻度

100%

問題のカテゴリ

環境情報

スクリーンショット

なし

beru commented 1 year ago

「編集中のテキストから検索」にチェックを入れると文書中のテキスト全体が対象になるのでそういう挙動になりますね。

Grep実行後に追加される検索条件と検索対象の行を自動的に検索対象から外すのは難しい気がします。Grep実行結果の文書から「編集中のテキストから検索」にチェックを入れてGrepを実行すると同じ文書に検索結果の文章が追記されます。その場合に各行が検索対象かどうかを適切に選別するのは難しいと思います。

1.「選択中のテキストから検索」みたいなチェックを新規に用意、ユーザーは検索対象のテキストを選択してからGrepする

  1. Grep実行後に追加される検索条件と検索対象の行をユーザーが自分で削除してからGrep
  2. ユーザーが自分でGrep結果を別の文書にコピーしてから再度Grepする

上記のようないくつかの対処方法が考えられます。

musagi commented 1 year ago

「2. Grep実行後に追加される検索条件と検索対象の行をユーザーが自分で削除してからGrep」を試してみましたが、再現手順3と同じ結果になりました(検索条件と検索対象の行だけでなくGrep実行結果をすべて削除しても同様)。

再現手順2の結果にはhugaという文字列が存在しないのですが、その手順2の結果の文書に直接Grepを実行すると検索結果にhugaが含まれる挙動となるのであれば、Grep検索の結果に対して直接Grepを実行するのはあきらめたほうがよさそうですね。

とりあえず「Grep結果を別の文書にコピーしてから再度Grepする」方法で回避しようと思います。

berryzplus commented 1 year ago

@musagi さん どう改善したらよいかの提案は可能ですか?

再現手順2で、検索結果が2行となっている点に違和感ありますが、「前回の検索条件」が検索対象になる挙動は妥当に思えます。「開いているウインドウ」を対象にGrepする場合、ウインドウに表示されている文字列の全文が検索対象になる仕様だからです。

使い勝手の問題として、「編集中のウインドウ」が「Grep検索結果」である場合、Grepの検索条件と思われる部分を除外して検索する、の仕様を追加したほうがよいの主張を否定するつもりはありません。

その場合、「なんで?なんでそうすると便利になる?」をプレゼンする感じになります。

musagi commented 1 year ago

「前回の検索条件」ではなく、これから実行しようとしている、ウインドウに表示されていない「今回の検索条件」が検索対象となっているようです。hogeとhugaが紛らわしいようですいません。

再現手順3の結果の検索対象が「 Window:[ 【Grep】"huga"]」となっていますので、おそらくGrep結果のウインドウにこれから検索しようとしている検索条件hugaについての文章を追加してから、その内容に対して検索を実行しているのではないでしょうか。

改善するとすれば、再現手順2のGrep結果のウインドウを対象としてGrepをする場合は、「今回の検索条件」を検索対象から外すか、再現手順2のGrep結果のウインドウに対してGrep結果を追記するのではなく、新しくウインドウを作成してGrep結果を表示するほうが直感的なのではないかと思います。

例えば、再現手順2のGrep結果のウインドウ(hogeの検索結果)に対してhugaでGrepする場合は、結果を表示するウインドウには以下が表示されることになります。

□検索条件  "huga"
検索対象       Window:[ 【Grep】"hoge"]
~ 省略 ~

0 個が検索されました。
berryzplus commented 1 year ago

理解しました。仕様バグですね。

検索対象が「現在のウインドウ」であり、かつ、「現在のウインドウ」が検索結果ウインドウである場合に Grep検索の開始直後に出力した「今回の検索条件」が検索対象になってしまう。

簡単な直し方は、「その場合は新しい検索結果ウインドウを開く」だと思いますが、ユーザビリティどうなんでしょう。