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 leur init.el
. De plus, le nettoyage est difficile.
Utilisez with-temp-buffer
et à la insert-file-contents
place. Si vous avez besoin de modes majeurs ou mineurs spécifiques dans le tampon, activez-les explicitement . Pour écrire des fichiers, utilisez with-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 compris
- poser des questions de manière interactive (cela seul est un non-usage dans une utilisation non interactive),
- activation automatique du mode d'affichage pour les fichiers en lecture seule,
- autrement en mode normal,
- et en cours d'exécution
find-file-hook
.
Mode normal lui-même
- sélectionne automatiquement un mode majeur approprié pour le tampon actuel,
- exécute tous les crochets correspondants des modes majeur et mineur,
- et lit toutes les variables locales pour le tampon actuel, c'est-à-dire les variables de fichier et les variables de répertoire, qui peuvent à nouveau poser des questions interactives sur les variables locales dangereuses.
É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
et insert-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
(insert-file-contents (locate-user-emacs-file "foo.el"))
;; Enter the major mode explicitly
(emacs-lisp-mode)
;; …
)
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:
(with-temp-file (locate-user-emacs-file "foo.el")
(prin1 (list 'my 'data) (current-buffer)))
good-practices
étiquette avant; est-ce une bonne idée de l'utiliser?