Wie kann ich Puffer automatisch schließen, wenn die zugrunde liegende Datei gelöscht wird?


9

Ich lasse Emacs den ganzen Tag laufen und werde häufig viele Dateisystemmanipulationen an Dateien durchführen, die in Emacs-Puffern geöffnet sind. Zum Beispiel könnte ich zu einem anderen Zweig in Git wechseln, der eine ganz andere Verzeichnisstruktur hat.

Leider habe ich eine Reihe offener Puffer, die Emacs jetzt als "modifizierte" Puffer registriert, die auf "neue" Dateien verweisen. Wenn ich sie nicht jedes Mal manuell schließe, ist es einfach, diese Puffer reflexartig zu speichern, was dann zu falschen, wahrscheinlich doppelten Dateien in meinem Projekt führt. Ich kann Emacs nicht einmal schließen, ohne die Frage "Diesen Puffer speichern" für jeden einzelnen zu beantworten.

Gibt es eine Möglichkeit, unveränderte Puffer automatisch zu schließen, wenn die zugrunde liegende Datei verschwindet? Ähnlich wie bei einem global-auto-revert-mode, der auch behandelt, wenn eine Datei vollständig entfernt wird?


Antworten:


6

Ich denke, etwas in dieser Richtung könnte funktionieren:

(defun buffer-backed-by-file-p (buffer)
  (let ((backing-file (buffer-file-name buffer)))
    (if (buffer-modified-p buffer)
        t
      (if backing-file
          (file-exists-p (buffer-file-name buffer))
        t))))

(mapc 'kill-buffer (-remove 'buffer-backed-by-file-p (buffer-list)))

Die buffer-backed-by-file-pFunktion prüft, ob die Datei von einer Datei gesichert wird. Wenn nicht, wird true zurückgegeben. Andernfalls wird zurückgegeben, ob die Sicherungsdatei vorhanden ist. Wir nehmen dann die Liste der Puffer, filtern alles andere heraus als diejenigen, die eine Sicherungsdatei haben sollten, aber die Datei existiert nicht, und töten sie dann.

Benötigt dash.el für -remove, da ich zu faul war, ein eingebautes zu finden, um dasselbe zu erreichen.

Hoffe das hilft!


Sie müssen diesen mapcBefehl immer noch ausführen, wenn Sie möchten, dass die nicht von Dateien gesicherten Puffer gelöscht werden, nicht wahr? Es ist also nicht vollautomatisch. Für eine vollständige Automatisierung müssen Sie entweder sicherstellen, dass mapcdie inotifyDatei wiederholt von selbst ausgeführt wird, oder sie für Sie ausführen, wenn eine Datei tatsächlich gelöscht wird.
Izkon

Ja, dies müsste regelmäßig oder als Reaktion auf Inotify-Ereignisse oder ähnliches ausgeführt werden. Ich selbst würde es nur regelmäßig ausführen, jede Minute oder so. Nicht perfekt, aber für die meisten Fälle gut genug. (run-with-timer 60 60 (lambda () (mapc 'kill-buffer (-remove 'buffer-backed-by-file-p (buffer-list)))))ist das, was ich als erste Annäherung verwenden würde.
Algernon

1
Implementierte dies und es funktionierte großartig. Ich habe diese kleine Wrapper-Funktion verwendet, um sie aufzurufen, falls jemand etwas Ähnliches benötigt: `(defun kill-remove-buffer () (interaktiv) (let ((to-kill (-remove 'buffer-Backed-by-file-p)))))))) (Pufferliste))) (mapc 'kill-buffer to-kill) (Meldung "Killed% s buffer" (Länge to-kill)))) `Sorry, ich kann es im Kommentarfeld nicht richtig formatieren .
Levand
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.