Schreiben eines geänderten Puffers in eine temporäre Datei


7

Ich möchte den geänderten Puffer, den ich gerade bearbeite, regelmäßig in eine temporäre Datei schreiben. Im Hintergrund könnte ich dann zum Beispiel externe Tools verwenden, um die Datei zu analysieren.

Ich möchte die Datei in diesem Prozess nicht an den tatsächlichen Speicherort schreiben - ich möchte, dass der Benutzer über den normalen :wBefehl dafür verantwortlich ist.

Wie kann ich dies in einem vom Autocommand aufgerufenen Vimscript tun CursorHold? Vim 7.4 und höher ist in Ordnung.


Sie können externe Tools direkt auf dem Inhalt (oder Teilen) Ihres Puffers mit ausführen :[range]w !command.
Romainl

Antworten:


8

Das ist ziemlich einfach:

:autocmd CursorHold *
\   let save_modified = &modified |
\       silent! execute 'write' fnameescape(tempname()) |
\   let &modified = save_modified

Dies hat jedoch den Nebeneffekt, dass :newbeim ersten Auslösen ein Puffer benannt wird. (Bestehende Dateien sind davon nicht betroffen. Dies ist der Unterschied zwischen :writeund :saveas.) Sie können entweder eine weitere Prüfung ( empty(bufname(''))) hinzufügen und diese rückgängig machen über :0fileoder ganz zu Funktionen auf niedrigerer Ebene wechseln:

:autocmd CursorHold * call writefile(getline(1, '$'), tempname())

Die Einschränkung dieses Ansatzes besteht darin, dass der Dateiinhalt immer beibehalten wird

  • Mit der 'encoding'Einstellung von Vim verlieren Sie also alle benutzerdefinierten Elemente 'fileencoding'des ursprünglichen Puffers
  • mit Unix (LF) -Zeilenenden (die Sie mit einer von map()über der Liste zurückgegebenen Liste wiederherstellen können getline()).
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.