Dans une réponse récente de lunaryorn , il a déclaré:
Cependant, je recommande contre la plupart des autres parties d'Org, pour les raisons déjà mentionnées dans les commentaires: il est ancien et plein de pratiques héritées et nuisibles (par exemple, find-file-noselect pour lire les fichiers de manière non interactive).
Quelqu'un peut-il expliquer pourquoi est find-file-noselect
une mauvaise idée de lire des fichiers dans les programmes Elisp? Y a-t-il une meilleure façon? Je demande parce que je pensais l'utiliser dans l'un de mes projets.
good-practices
étiquette avant; est-ce une bonne idée de l'utiliser?good-practices
cela relèverait de la catégorie des «balises meta», qui est mal vu par SE.Réponses:
TL; DR : Avec
find-file-noselect
vous n'avez aucun contrôle sur ce qui se passe réellement, et vous pouvez vous retrouver avec des modes mineurs arbitraires activés dans le tampon, selon ce que l'utilisateur a activé dans leurinit.el
. De plus, le nettoyage est difficile.Utilisez
with-temp-buffer
et à lainsert-file-contents
place. Si vous avez besoin de modes majeurs ou mineurs spécifiques dans le tampon, activez-les explicitement . Pour écrire des fichiers, utilisezwith-temp-file
plutôt qui, malgré son nom, vous permet d'écrire dans des fichiers arbitraires.Effets secondaires
find-file-noselect
a beaucoup d'effets secondaires, y comprisfind-file-hook
.Mode normal lui-même
Étant donné que tous les hooks sont exécutés, vous obtenez tous les modes mineurs et les fonctions de hook que l'utilisateur a activés dans leur
init.el
, ce qui peut tout causer, des inconvénients mineurs (si les modes mineurs indésirables sont activés) aux ravages majeurs (si l'utilisateur a ajouté une fonction de hook qui s'attend à être appelé à partir d'un contexte interactif).Voir https://github.com/flycheck/flycheck/issues/366 pour un exemple. L'utilisation de a
find-file-noselect
provoqué la vérification de la syntaxe d'un fichier de données par Flycheck, et comme cela se produisait lors de l'arrêt d'Emacs, il n'y avait pas de temps pour nettoyer correctement à nouveau, laissant un fichier temporaire derrière.Nettoyer
Avec
find-file-noselect
vous devez être extrêmement prudent pour tuer à nouveau le tampon.find-file-noselect
ne fait pas cela pour vous.Vous devez vous souvenir du tampon à un certain endroit et utiliser soigneusement
unwind-protect
pour vous assurer que le tampon est tué même en cas de sorties non locales.Alternatives
Pour lire des fichiers, utilisez
with-temp-buffer
etinsert-file-contents
, qui ne fait que les choses les plus élémentaires, par exemple la conversion du système de codage, mais sans poser de questions, activer les hooks ou configurer des variables locales:with-temp-buffer
prend soin de bien tuer le tampon temporaire au bout de son corps.Pour écrire des fichiers, utilisez
with-temp-file
, qui crée un tampon temporaire et écrit le contenu dans le nom de fichier donné à la fin de son corps:la source
De la section 24.3 du manuel Elisp:
find-file-noselect
Il est évident que la recherche dans la documentation Elisp fait bien plus que la simple lecture d'un fichier dans un tampon. Peut-être que les gens qui pensent que l'utilisation de cette fonction est une mauvaise idée réfléchissent aux effets secondaires, éventuellement indésirables,? Je suppose que cela dépend de ce que vous voulez réaliser. Si vous voulez avoir un contenu de tampon aussi propre / intact que possible, ce pourrait être une bonne idée d'utiliser la combinaison ancienne et fidèlewith-temp-buffer
+insert-file-contents
. Si vous voulez le contenu du tampon d'être aussi proche de cefind-file
produire, peut - être vous ne voulez utiliserfind-file-noselect
? Ou peut-être qu'il réfléchissaitfind-file
;)la source
find-file
processus.