検索結果を差分の違いに制限する方法はありますか?


7

DiffText編集中のファイルの領域内のみを検索できるようにしたい。

関連質問:https : //stackoverflow.com/questions/2683521/vim-search-in-cc-code-lines

ここで受け入れられた答えは、発言CommentType構文グループには適しているようですが、Diffグループはどれも機能しません。それは、diffグループが他のグループ内にネストされていることに関係していると思います。

私の具体的なシナリオは、一連のファイルから一連のタブと末尾のスペースを削除したことです。ファイルをオリジナルと比較し、タブと末尾のスペース以外は何も変わらないようにしたいと思います。

PS以前のバージョンでは一貫性のないインデントを使用しており、すべてを手動で確認する必要があるため、すべてのタブをグローバルに置き換えたくありません。


2
:set diffopt+=iwhite、または私は誤解していますか?
アントニー

うーん、私はそれが思うだろう私の特定のシナリオのために働きます。ありがとう!ただし、他の考えられるシナリオで検索結果を制限する方法があるかどうかを知りたいと思っています。
Tumbler41 2016年


その投稿は、投稿されたQIにリンクしています。:P
Tumbler41

回答:


7

ネイティブではありません(また、search()関数にスキップ式を追加できるようにするパッチを作成しましたが、これはまだ含まれていません)。

しかし、一致が含まれているdiff領域にあるかどうかをチェックする独自の関数を作成することで、これを回避できます。このようなもの(非常に基本的なアプローチ):

function! Search(pat)
    while search(a:pat, 'w') > 0
        if diff_hlID(line('.'),col('.')) != 0
            break
        endif
    endwhile
endfunction

com! -nargs=1 Search :call Search(<q-args>)

より多くのエッジケースをチェックして処理するエラー(検索が一巡した後の中止など)は、ユーザーに演習として残されました。


男、vimは巨大です。diff_hlIDが存在することさえ知らなかった。ありがとう!
アントニー

1
驚くばかり!ただ、私が何か間違ったことを理解していない限り、あなたのifステートメントはif... != 0diffに到達したときに検索を中断するようにすべきだと思います。それは私にとって少なくともうまくいったように思われたものです。(私はあなたの機能が完全であることを意図していないことを知っています、しかし私はこれが逆であることをかなり確信しています。)
Tumbler41

@ Tumbler41私はこれが正しいと思います。
Christian Brabandt 16年

@ChristianBrabandt将来の読者のために編集を心に留めていますか?:)
Tumbler41

3

さて、違いを検索する簡単な方法(DiffTextだけでなく、すべての異なる行、申し訳ありません)はdiff、2つのファイルで実行 し、出力をバッファに入れてそこで検索することです。vimdiffでfileaとfilebを表示していると仮定します。

:new | r! diff -u0 filea fileb
/search-for-something

行番号は次のような行で出力されます

@@ -9,3 +8,6 @@

したがって、元のファイルの行(9)に簡単にジャンプできます。

?@@<CR>0/\d<CR>yw:q!:@"<CR>

これは、行番号の行を逆方向に検索し、行番号を@ "にヤンクし、一時検索バッファを閉じて、行番号にジャンプします。ウィンドウレイアウトなどを考慮して、これをマッサージしたい場合があります。おそらくそれをキーにマップします。

読みやすくするために、diffにコンテキスト行を含めることもできますが、検索が変更のある行(つまり、空白以外で始まる行)にあることを確認してください。

/^\S.*\zssearch-for-something

2
ああ、フィルタリングアプローチ。思っていたほどではありませんが、これで後回しにできます。ただし、マクロを完全に理解しようとしています。ヘッダー行は次の形式です@@ -292,2 +283,7 @@。そうは言っても、0/検索パターンの目的がよくわかりません。さらにyW、WORD、つまりをヤンクし292,2ます。これを実行すると:@"、292ではなく2行目に移動します?@@.*+?e+1<CR>yw:q!<CR>:@"<CR>。次のようなものが思いつくと思います。最初のファイルを、見たいファイル+-応じて変更でき ます。考え?
Tumbler41 2016年

エラーが発生しました。ごめんなさい。編集されました。
アントニー

1
<CR>検索パターンを終了するための行方不明がありました、そしてあなたが言ったyWとおりであるはずywです!
アントニー

2
ええ、それらは私に良い提案のように見えます。ジャンプ先のファイルに応じて2つのマッピングを作成する+-、行の先頭または行の先頭とヘッダーのファイル名から自動的にマッピングすることができます。
アントニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.