Markiertes Rückgängigmachen in Vim


12

Ich versuche, ein hervorgehobenes Rückgängigmachen in Vim zu haben, wie die Standardkonfiguration von Spacemacs. Manchmal, wenn ich schnell rückgängig machen möchte, kann ich nicht erkennen, was sich geändert hat, weil es augenblicklich ist. Also versuche ich so etwas zu haben, wenn eine Presse rückgängig macht:

hervorgehoben rückgängig machen

Hat jemand eine Idee, wie man das in Vim macht?

(Ich habe bereits ein Gundo-Plugin, ich möchte nur das Rückgängigmachen der Standardeinstellung reibungsloser gestalten.)

Bearbeiten : Das Undotree- Plugin erledigt die Arbeit ( Gundo hebt die Änderungen nicht hervor). Verwenden Sie einfach den UndotreeToggleBefehl und alle zukünftigen Änderungen an der Datei werden hervorgehoben.


Gute Idee. Mit können Sie ein Highlight erstellen matchadd(), etwas kniffliger ist es jedoch, herauszufinden, welche Teile der Datei geändert wurden.
Joeytwiddle

Vielleicht vor dem Rückgängigmachen in einen temporären Puffer / eine temporäre Datei speichern, dann nach dem Rückgängigmachen in einen zweiten Puffer / eine zweite Datei speichern und die neuen Unterschiede nach dem Reinigen (oder Ändern der Farbe) der vorherigen hervorheben. Kann bei großen Dateien langsam werden.
VanLaser

UndoTree hebt zwar geänderte Zeilen hervor , dies geschieht jedoch nicht in Echtzeit. Ich denke, dass es GNU Diff verwendet. Das Ermitteln der Wortgranularität wäre ein zusätzlicher Schritt (z. B. Aufteilen von Zeilen bei Wortumbrüchen , Diff, Neukombinieren von Zeilen).
Joeytwiddle

Diese Plug-ins kommen dem nahe, sind aber immer noch zeilenbasiert : smeargle kann Zeilen markieren, die seit dem letzten Speichern geändert wurden. changesPlugin markiert geänderte Zeilen (einschließlich Löschungen) in der linken Rinne.
Joeytwiddle

1
@joeytwiddle, changesPlugin kann auch die letzte Änderungsregion hervorheben
Christian Brabandt

Antworten:


6

Neue Lösung

Sie können Ihre letzten Änderungen mit dem :changesBefehl anzeigen . Sie können also Ihre letzte Zeilenänderung mit einem regulären Ausdruck durchführen und die Zeile dann matchadd()wie von @joeytwiddle vorgeschlagen auf anwenden.

Hier ist der Code:

function! DiffWithPrevious()
  call clearmatches()
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=green guibg=green
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction

Hinweis :

  • Diese Funktion fügt nur eine neue Markierung hinzu, ohne die alte zu entfernen. Sie müssen also zuerst die alte entfernen. Mit der clearmatchesFunktion können Sie die Übereinstimmungen entfernen, bevor Sie eine neue hinzufügen. Vorsicht, es werden ALLE Übereinstimmungen entfernt. Wenn Sie mehr Granularität wünschen, können Sie Ihre Übereinstimmung speichern und manuell entfernen:

z.B

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • Nach einigen Tests stellte ich fest, dass es nur für einzeilige Änderungen funktioniert.

Verweise :


Alte Lösung

Hier ist eine mögliche Lösung, die hauptsächlich vom aktuellen Diff-Puffer und der Originaldatei inspiriert ist :

function! DiffWithPrevious()
  undo
  write
  redo
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction

Die Idee ist, die Datei mit der Datei auf dem System zu vergleichen, so dass Sie Ihre letzte Änderung rückgängig machen, sie schreiben, die Laseränderung wiederholen und den Vergleich ausführen.

Ich denke, dies sollte den Job für zeitliche Diff-Visualisierungen von Zeit zu Zeit erledigen.


Gibt es eine Möglichkeit, die Meldung "Puffer" auf DiffWithPrevious () zu löschen? Ich wünschte, die Funktion hätte nur die letzten Änderungen hervorgehoben, aber die Hervorhebung sammelt sich im Laufe der Zeit an. Ich versuche so etwas wie message = 0 oder message = "", aber kein Erfolg.
tjbrn

Natürlich ja, lassen Sie mich meine Antwort aktualisieren.
nobe4


2

Für jemanden, der das Gleiche von mir versucht, ist das am nächsten, den ich dank der Antworten erreicht habe.

function! DiffWithPrevious()
  call clearmatches()
  undo
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=black guibg=black
  let m = matchadd('TemporalDiff', '\%'.line.'l')
  redraw
  let gchar = getchar()
  highlight TemporalDiff ctermbg=none guibg=none
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.