En una respuesta reciente de lunaryorn , declaró:
Sin embargo, recomendaría contra la mayoría de las otras partes de Org, por razones ya mencionadas en los comentarios: es antiguo y está lleno de prácticas heredadas y dañinas (por ejemplo, find-file-noselect para leer archivos de manera no interactiva).
¿Alguien puede explicar por qué es find-file-noselect
una mala idea leer archivos en los programas de Elisp? ¿Hay una mejor manera? Lo pregunto porque estaba pensando en usarlo en uno de mis proyectos.
good-practices
etiqueta antes; ¿Es una buena idea usarlo?good-practices
caería en la categoría de "metaetiqueta", que está mal visto por SE.Respuestas:
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 ellosinit.el
. Además, la limpieza es difícil.Uso
with-temp-buffer
y en suinsert-file-contents
lugar. Si necesita modos mayores o menores específicos en el búfer, habilítelos explícitamente . Para escribir archivos, usewith-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, incluidosfind-file-hook
.Modo normal en sí
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 tiDebe 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
yinsert-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
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:fuente
De la sección 24.3 del manual de Elisp:
Buscar en la documentación de Elisp
find-file-noselect
es obvio que hace mucho más que simplemente leer un archivo en un búfer. ¿Quizás las personas que piensan que usar esta función es una mala idea están pensando en los efectos secundarios, posiblemente no deseados? Supongo que depende de lo que quieras lograr. Si desea tener el contenido de búfer lo más limpio / intacto posible, puede ser una buena idea usar la combinación antigua y confiablewith-temp-buffer
+insert-file-contents
. Si desea que el contenido del búfer a estar tan cerca de lo quefind-file
producen, tal vez usted no desea utilizarfind-file-noselect
? O tal vez estaba pensandofind-file
;)fuente
find-file
proceso.