In einer kürzlichen Antwort von lunaryorn erklärte er:
Ich würde jedoch aus den bereits in den Kommentaren genannten Gründen gegen die meisten anderen Teile von Org empfehlen: Es ist alt und voller alter und schädlicher Praktiken (z. B. find-file-noselect, um Dateien nicht interaktiv zu lesen).
Kann jemand erklären, warum es find-file-noselect
eine schlechte Idee ist, Dateien in Elisp-Programmen zu lesen? Gibt es einen besseren Weg? Ich frage, weil ich darüber nachgedacht habe, es in einem meiner Projekte zu verwenden.
good-practices
vorher kein Etikett; Ist es eine gute Idee, es zu benutzen?good-practices
würde unter die Kategorie "Meta-Tag" fallen, die von SE verpönt wird .Antworten:
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 hatinit.el
. Auch die Bereinigung ist schwierig.Verwenden Sie
with-temp-buffer
undinsert-file-contents
stattdessen. Wenn Sie bestimmte Haupt- oder Nebenmodi im Puffer benötigen, aktivieren Sie diese explizit . Verwenden Siewith-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ßlichfind-file-hook
.Normaler Modus selbst
Da alle Hooks ausgeführt werden, erhalten Sie alle vom Benutzer aktivierten Nebenmodi und Hakenfunktionen
init.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
undinsert-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
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 :quelle
Aus Abschnitt 24.3 im Elisp-Handbuch:
Das Durchsuchen der Elisp-Dokumentation
find-file-noselect
ist offensichtlich, dass es viel mehr als nur das Einlesen einer Datei in einen Puffer bewirkt. Vielleicht denken Leute, die diese Funktion für eine schlechte Idee halten, über die möglicherweise unerwünschten Nebenwirkungen nach? Ich denke, es hängt davon ab, was Sie erreichen wollen. Wenn Sie so sauberen / unberührten Pufferinhalt wie möglich haben möchten, ist es möglicherweise eine gute Idee, die alte und vertrauenswürdigewith-temp-buffer
+insert-file-contents
Kombination zu verwenden. Wenn Sie möchten, dass der Pufferinhalt demfind-file
Produkt so nahe kommt, möchten Sie ihn vielleicht verwendenfind-file-noselect
? Oder vielleicht hat er darüber nachgedachtfind-file
;)quelle
find-file
Prozess nachahmen .