TL; DR : Wenn find-file-noselect
Sie keine Kontrolle darüber haben, was tatsächlich passiert, werden möglicherweise beliebige Nebenmodi im Puffer aktiviert, je nachdem, was der Benutzer in seinem Puffer aktiviert hat init.el
. Auch die Bereinigung ist schwierig.
Verwenden Sie with-temp-buffer
und insert-file-contents
stattdessen. Wenn Sie bestimmte Haupt- oder Nebenmodi im Puffer benötigen, aktivieren Sie diese explizit . Verwenden Sie with-temp-file
stattdessen zum Schreiben von Dateien, mit denen Sie trotz des Namens in beliebige Dateien schreiben können.
Nebenwirkungen
find-file-noselect
hat viele Nebenwirkungen, einschließlich
- interaktiv Fragen stellen (das allein ist ein No-Go bei nicht interaktiver Verwendung),
- automatisch den Ansichtsmodus für schreibgeschützte Dateien aktivieren,
- sonst in den normalen Modus wechseln,
- und rennen
find-file-hook
.
Normaler Modus selbst
- wählt automatisch einen geeigneten Hauptmodus für den aktuellen Puffer aus,
- führt alle entsprechenden Major- und Minor-Mode-Hooks aus,
- und liest alle lokalen Variablen für den aktuellen Puffer, dh Dateivariablen und Verzeichnisvariablen, die wiederum interaktive Fragen zu unsicheren lokalen Variablen stellen können.
Da alle Hooks ausgeführt werden, erhalten Sie alle vom Benutzer aktivierten Nebenmodi und Hakenfunktioneninit.el
, die alles verursachen können, von geringfügigen Unannehmlichkeiten (wenn unerwünschte Nebenmodi aktiviert sind) bis hin zu schwerwiegenden Problemen (wenn der Benutzer eine erwartete Hook-Funktion hinzugefügt hat) aus einem interaktiven Kontext aufgerufen werden).
Ein Beispiel finden Sie unter https://github.com/flycheck/flycheck/issues/366 . Die Verwendung von führte dazu, find-file-noselect
dass eine Datendatei von Flycheck syntaktisch überprüft wurde. Da dies beim Herunterfahren von Emacs geschah, war keine Zeit für eine erneute ordnungsgemäße Bereinigung, sodass eine temporäre Datei zurückblieb.
Aufräumen
Mit müssen find-file-noselect
Sie besonders vorsichtig sein, um den Puffer wieder zu töten. find-file-noselect
tut das nicht für dich.
Sie müssen sich an einer Stelle an den Puffer erinnern und ihn sorgfältig verwenden unwind-protect
, um sicherzustellen, dass der Puffer auch bei nicht lokalen Exits getötet wird.
Alternativen
Verwenden Sie zum Lesen von Dateien with-temp-buffer
und insert-file-contents
, das nur die grundlegendsten Aufgaben ausführt, z. B. die Konvertierung des Codierungssystems, aber keine Fragen stellt, Hooks aktiviert oder lokale Variablen einrichtet:
(with-temp-buffer
(insert-file-contents (locate-user-emacs-file "foo.el"))
;; Enter the major mode explicitly
(emacs-lisp-mode)
;; …
)
with-temp-buffer
achtet darauf, den temporären Puffer am Ende seines Körpers richtig abzutöten.
Verwenden Sie zum Schreiben von Dateien Folgendes, um with-temp-file
einen temporären Puffer zu erstellen und den Inhalt in den angegebenen Dateinamen am Ende seines Körpers zu schreiben :
(with-temp-file (locate-user-emacs-file "foo.el")
(prin1 (list 'my 'data) (current-buffer)))
good-practices
vorher kein Etikett; Ist es eine gute Idee, es zu benutzen?