TL; DR : Con find-file-noselect
usted no tiene control sobre lo que realmente sucede, y puede terminar con modos menores arbitrarios habilitados en el búfer, dependiendo de lo que el usuario haya habilitado en ellos init.el
. Además, la limpieza es difícil.
Uso with-temp-buffer
y en su insert-file-contents
lugar. Si necesita modos mayores o menores específicos en el búfer, habilítelos explícitamente . Para escribir archivos, use with-temp-file
en su lugar, lo que, a pesar de su nombre, le permite escribir en archivos arbitrarios.
Efectos secundarios
find-file-noselect
tiene muchos efectos secundarios, incluidos
- hacer preguntas de forma interactiva (solo eso es un no-uso en uso no interactivo),
- habilitación automática del modo de visualización para archivos de solo lectura,
- entrando en modo normal de lo contrario,
- y en funcionamiento
find-file-hook
.
Modo normal en sí
- selecciona automáticamente un modo principal adecuado para el búfer actual,
- ejecuta todos los ganchos de modo mayor y menor correspondientes,
- y lee todas las variables locales para el búfer actual, es decir, las variables de archivo y las variables de directorio, que nuevamente pueden hacer preguntas interactivas sobre variables locales inseguras.
Como todos los ganchos se ejecutan, obtienes todos los modos menores y las funciones de gancho que el usuario habilitó en ellas init.el
, lo que puede causar todo, desde inconvenientes menores (si se habilitan modos menores indeseables) hasta estragos mayores (si el usuario agregó una función de gancho que espera ser llamado desde un contexto interactivo).
Consulte https://github.com/flycheck/flycheck/issues/366 para ver un ejemplo. El uso de find-file-noselect
provocó que Flycheck verificara la sintaxis de un archivo de datos, y dado que estaba ocurriendo en el apagado de Emacs, no hubo tiempo para limpiarlo correctamente nuevamente, dejando atrás un archivo temporal.
Limpiar
Con find-file-noselect
usted debe tener mucho cuidado para matar el búfer de nuevo. find-file-noselect
no hace eso por ti
Debe recordar el búfer en algún lugar y utilizarlo unwind-protect
con cuidado para asegurarse de que el búfer se destruya incluso en el caso de salidas no locales.
Alternativas
Para leer archivos, use with-temp-buffer
y insert-file-contents
, que solo hace las cosas más básicas, por ejemplo, la conversión del sistema de codificación, pero no hace preguntas, habilita enlaces o configura 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
se encarga de matar adecuadamente el búfer temporal al final de su cuerpo.
Para escribir archivos, use with-temp-file
, que crea un búfer temporal y escribe el contenido en el nombre de archivo dado al final de su cuerpo:
(with-temp-file (locate-user-emacs-file "foo.el")
(prin1 (list 'my 'data) (current-buffer)))
good-practices
etiqueta antes; ¿Es una buena idea usarlo?