Bereinigungsbefehle nur für bearbeitete Zeilen ausführen möglich?

8

In Bezug auf Bereinigungsaufgaben wie (ohne darauf beschränkt zu sein) die in diesen Fragen beschriebenen:

Gibt es eine Möglichkeit, diese Befehle nur auf die Zeilen der Dateien anzuwenden, die tatsächlich geändert wurden? Dies dient dazu, die Diff-Ausgabe nach dem Bearbeiten des Quellcodes auf die tatsächliche Änderung zu konzentrieren (ein potenzieller Code-Reviewer würde durch die Änderungen beim Bereinigen der gesamten Datei nicht verwirrt), ohne neue Formatierungsprobleme einzuführen.

Guido
quelle
vim.wikia.com/wiki/… ... Könnte ein guter Anfang sein ... Keine Zeit, jetzt eine vollständige Antwort zu schreiben
;-)
@ Carpetsmoker Danke für den Link
Guido
Ich habe noch ein bisschen gegraben und ich denke nicht, dass dies möglich ist. :changesfunktioniert nicht ohne viel Hackery; Wie es scheint, sind diese Informationen in der Viminfo-Datei gespeichert, und es gibt keine Möglichkeit zu sehen, welche Änderungen Sie in dieser Sitzung vorgenommen haben und welche in der vorherigen ... Es sei denn, Sie deaktivieren die Viminfo-Datei natürlich, aber das ist ziemlich umständlich ... möchte hier allerdings das
Gegenteil
@Carpetsmoker Ich glaube nicht, dass die Änderungsliste genügend Informationen enthält, um diese Funktion zu implementieren, selbst wenn Sie die in jeder Sitzung vorgenommenen Änderungen isolieren könnten. Es enthält eine einzelne Cursorposition für jede Änderung, sodass Sie den Umfang der vorgenommenen Bearbeitung nicht erkennen können.
Rich
@ Rich Ja, ich bin zu dem gleichen Schluss gekommen ...
Martin Tournoij

Antworten:

4

Sie können den Befehl verwenden folddoopen, um einen Befehl nur in Zeilen auszuführen, die sich nicht innerhalb einer geschlossenen Falte befinden.

Mit dem folgenden Befehl können Sie beispielsweise Leerzeichen am Zeilenende entfernen:

:%s/\s\+$//

Um dies nur auf die Linien anzuwenden, die sich derzeit nicht in einer geschlossenen Falte befinden, fügen Sie Folgendes hinzu folddopen:

:%folddoopen s/\s\+$//

folddoopenkann auch mit abgekürzt werden foldd.

Wenn Sie Vim als Diff-Tool Ihrer Quellcodeverwaltung verwenden, können Sie damit Änderungen nur auf geänderte Linien anwenden, während Sie das Diff anzeigen.

Beachten Sie, dass der Diff-Modus von Vim standardmäßig einige Zeilen vor und nach jedem geänderten Abschnitt anzeigt. Um also nicht Linien zu beeinflussen , die unmittelbar vor oder nach geändertenen Zeilen Sie zum ersten Satz benötigen, contextin diffoptan 0zB:

:set diffopt=filler,context:0

Bei manuellen Änderungen ist möglicherweise auch die foldopenOption hilfreich. Es definiert, welche Arten von Befehlen das Öffnen von Falten verursachen. Beachten Sie jedoch, dass dies nicht verhindert, dass die Bearbeitung innerhalb der Falten wie beim folddoopenBefehl erfolgt.

(Wenn Sie mit "den Zeilen der Dateien, die tatsächlich geändert wurden" etwas anderes meinen, müssen Sie einen Weg finden, die unveränderten Zeilen wegzufalten, bevor Sie den Befehl ausführen: Der einfachste Weg ist, eine unveränderte Kopie beizubehalten der Datei und verwenden Sie vimdiff manuell.)

Reich
quelle
2
Das ist eine sehr kreative Idee! Ich wusste nichts darüber :folddoopen, scheint ein sehr nützlicher Befehl zu sein. Ich wollte auch anbieten, dass Sie mit fugitive.vim den Unterschied Ihres aktuellen Puffers mit dem :GdiffBefehl leichter erkennen können .
Tommcdo
Das funktioniert gut; Ich kann einen Arbeitspuffer öffnen, bei dem die vorherige Version von der aktuellen Version abweicht :vsp new, dann :read !git show HEAD~1:pathund schließlich :windo diffthis(und dann Ihre Lösung verwendet).
Guido