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-noselectuna 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-practicesetiqueta antes; ¿Es una buena idea usarlo?good-practicescaería en la categoría de "metaetiqueta", que está mal visto por SE.Respuestas:
TL; DR : Con
find-file-noselectusted 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-buffery en suinsert-file-contentslugar. Si necesita modos mayores o menores específicos en el búfer, habilítelos explícitamente . Para escribir archivos, usewith-temp-fileen su lugar, lo que, a pesar de su nombre, le permite escribir en archivos arbitrarios.Efectos secundarios
find-file-noselecttiene 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-noselectprovocó 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-noselectusted debe tener mucho cuidado para matar el búfer de nuevo.find-file-noselectno hace eso por tiDebe recordar el búfer en algún lugar y utilizarlo
unwind-protectcon 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-bufferyinsert-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-bufferse 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-noselectes 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-fileproducen, tal vez usted no desea utilizarfind-file-noselect? O tal vez estaba pensandofind-file;)fuente
find-fileproceso.