Gibt es eine Möglichkeit, Suchergebnisse auf Unterschiede in einem Diff zu beschränken?

7

Ich möchte nur in den DiffTextRegionen einer Datei suchen können, die ich bearbeite.

Verwandte Frage: /programming/2683521/vim-search-in-cc-code-lines

Die akzeptierte Antwort scheint hier zu arbeiten groß für etwa Commentoder TypeSyntaxgruppen, aber jede der Diff - Gruppen nicht funktionieren. Ich vermute, dass es etwas damit zu tun hat, dass die Diff-Gruppen in anderen Gruppen verschachtelt sind.

Mein spezielles Szenario ist, dass ich eine Reihe von Tabulatoren und nachgestellten Leerzeichen aus einer Reihe von Dateien entfernt habe. Ich habe die Dateien mit den Originalen unterschieden und möchte sicherstellen, dass nichts außer Tabulatoren und nachgestellten Leerzeichen unterschiedlich sind.

PS Ich möchte nicht alle Registerkarten global ersetzen, da mein Vorgänger inkonsistente Einrückungen verwendet hat und ich alle manuell überprüfen muss.

Tumbler41
quelle
2
:set diffopt+=iwhiteoder habe ich falsch verstanden?
Antony
Hmm, ich nehme an, das würde für mein spezifisches Szenario funktionieren. Vielen Dank! Es würde mich jedoch immer noch interessieren, ob es eine Möglichkeit gibt, die Suchergebnisse für andere mögliche Szenarien einzuschränken.
Tumbler41
In Verbindung stehender Beitrag: Suche innerhalb der Syntaxgruppe?
Peter Rincker
Dieser Beitrag enthält Links zum veröffentlichten QI. : P
Tumbler41

Antworten:

7

Nicht nativ (auch ich habe einen Patch geschrieben, mit dem der Funktion search () ein Sprungausdruck hinzugefügt werden kann, der jedoch noch nicht enthalten ist).

Sie können dies jedoch umgehen, indem Sie eine eigene Funktion schreiben, die überprüft, ob sich die Übereinstimmung in einem enthaltenen Diff-Bereich befindet. So etwas (sehr grundlegender Ansatz):

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>)

Fehlerprüfung und Behandlung weiterer Randfälle (Abbruch, nachdem die Suche abgeschlossen wurde, z. B.), die dem Benutzer als Übung überlassen wurden.

Christian Brabandt
quelle
Mann, vim ist riesig; Ich wusste nicht einmal, dass diff_hlID existiert. Vielen Dank!
Antony
1
Genial! Nur, wenn ich etwas nicht falsch verstehe, denke ich, dass Ihre if-Aussage so sein sollte, if... != 0dass sie von der Suche abbricht, wenn sie auf einem Diff landet. Das schien zumindest für mich zu funktionieren. (Ich weiß, dass Ihre Funktion nicht vollständig sein sollte, aber ich bin mir ziemlich sicher, dass dies rückwärts ist.)
Tumbler41
@ Tumbler41 Ich denke das bist du richtig.
Christian Brabandt
@ChristianBrabandt Gedankenbearbeitung für zukünftige Leser? :)
Tumbler41
3

Nun, die einfache Möglichkeit, die Unterschiede zu durchsuchen (alle unterschiedlichen Zeilen, nicht nur DiffText, sorry), besteht darin, diffdie beiden Dateien auszuführen , die Ausgabe in einen Puffer zu legen und dort zu suchen. Angenommen, Sie sehen filea und fileb in vimdiff:

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

Zeilennummern werden in der Ausgabe in Zeilen wie angezeigt

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

So können Sie leicht zur Zeile (9) in der Originaldatei springen:

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

Dadurch wird rückwärts nach einer Zeilennummer gesucht, die Zeilennummer in @ "gezogen, der temporäre Suchpuffer geschlossen und zur Zeilennummer gesprungen. Sie möchten diese wahrscheinlich massieren, um Ihr Fensterlayout usw. zu berücksichtigen. und vielleicht einem Schlüssel zuordnen.

Sie können auch Kontextzeilen in das Diff aufnehmen, um das Lesen zu erleichtern. Stellen Sie jedoch sicher, dass Ihre Suchanfragen in Zeilen mit Änderungen angezeigt werden, dh in Zeilen, die mit einem nicht leeren Zeichen beginnen:

/^\S.*\zssearch-for-something
Antonius
quelle
2
Ah, ein Filteransatz. Nicht ganz das, was ich mir vorgestellt hatte, aber ich kann dahinter kommen. Ich versuche immer noch, Ihr Makro vollständig zu verstehen. Meine Kopfzeilen haben die Form : @@ -292,2 +283,7 @@. Davon abgesehen kann ich nicht genau herausfinden, wofür das 0/in Ihrem Suchmuster ist. Zusätzlich yWwird das WORT gezogen, was bedeutet 292,2. Wenn Sie ausführen, gelangen :@"Sie zu Zeile 2 anstelle von 292. Ich denke, ich würde mir so etwas einfallen lassen : ?@@.*+?e+1<CR>yw:q!<CR>:@"<CR>. Sie können die erste ändern +, -je nachdem, welche Datei Sie anzeigen möchten. Gedanken?
Tumbler41
Ups, Tippfehler, sorry. Bearbeitet.
Antony
1
Es fehlte, <CR>um das Suchmuster zu beenden, und das yWsollte so sein, ywwie Sie es gesagt haben!
Antony
2
Ja, das sieht für mich nach guten Vorschlägen aus. Sie können zwei Zuordnungen haben, je nachdem, zu welcher Datei Sie springen möchten, oder Sie können dies automatisch anhand des +oder -am Anfang der Zeile und der Dateinamen in der Kopfzeile herausfinden .
Antony