Es una práctica común escribir archivos de configuración de Emacs usando un estilo de programación alfabetizado en modo Org.
Desafortunadamente, al tiempo que mejora la legibilidad, esto conlleva importantes desventajas de programación. En particular, dado que no hay un .el
archivo de respaldo , Emacs solo conoce el código en el bloque fuente actual. Esto significa que, excepto por el bloque editado actualmente, la navegación, la definición del símbolo y el chequeo no están disponibles.
#+BEGIN_SRC emacs-lisp
(defun literate-but-invisible ()
(interactive)
(message "I close my eyes..."))
#+END_SRC
#+BEGIN_SRC emacs-lisp
(defun humans-can-read-but-emacs-cannot ()
(interactive)
(literate-but-invisible) ; No navigation! Flycheck reports undefined symbol!
(message "...so that the room will be empty"))
#+END_SRC
¿Hay alguna forma de decirle a Emacs que se enrede y use el .el
archivo generado para proporcionar estas características en modo Org? Tal característica mejoraría la capacidad de mantenimiento del código alfabetizado Emacs Lisp.
Tenga en cuenta que si bien sería una característica fantástica ver Flycheck trabajando para Org y Emacs Lisp simultáneamente en un búfer, solo estoy preguntando cómo instrumentar los org-edit
búferes (el entorno que se obtiene cuando se invoca org-edit-special
(generalmente C-c '
)). Esto debería ser más fácil ya que solo hay un modo activo para el búfer.
He abierto una solicitud de función en el repositorio Flycheck aquí , y hay algunas investigaciones relevantes en otro tema aquí . Sin embargo, todavía no puedo construir una solución.
fuente
find-file-hook
etc. para detectar si se abre el archivo de configuración de emacsRespuestas:
Para la navegación y la definición de símbolos, consulte https://github.com/jkitchin/scimax/blob/master/scimax-literate-programming.el
Puede generar un archivo TAGS con Mx scimax-lp-generate-tags.
Después de esto, puedo navegar a las definiciones de funciones con M-. y M-,. Necesita actualizar el archivo TAGS con esa función a medida que las cosas se mueven y se agregan, pero tal vez eso se pueda hacer en un gancho de almacenamiento intermedio de almacenamiento o algo así. También tenga en cuenta que esto proporciona etiquetas relativas al archivo org, no a dónde están las definiciones en los archivos fuente.
Mx scimax-lp-signature-doc obtendrá alguna información sobre el símbolo en el punto si está definido en el archivo org.
Desarrollé una forma conceptual para hacer que flycheck funcione en src-blocks en org-files. La idea es tener un archivo proxy que tenga el código enredado, exactamente en las mismas posiciones de caracteres (es decir, cambia todos los demás caracteres a espacios). Luego, deje que flycheck funcione en ese archivo. Luego, transfiera las superposiciones de flycheck del archivo proxy al archivo original. Configura una función de enlace para actualizar el archivo proxy al guardar y luego actualiza las superposiciones. Sorprendentemente, esto funciona bastante bien.
Puede ver el código en https://github.com/jkitchin/scimax/blob/master/scimax-ob-flycheck.org .
Así es como se ve un mal código
Después de activar scimax-ob-flycheck-mode, parece que:
fuente
org-edit
se invoca. En ese caso, solo habría un modo activo para el búfer. Edité mi pregunta para agregar algunos matices allí.emacs -q
, dependencias instaladas, y luego corrí(org-babel-load-file "scimax-ob-flycheck.org")
seguido de(scimax-ob-flycheck-mode +1)
. No veo ningún error de Flycheck cuando creo un código roto como prueba.flycheck
superposiciones en elmd5-hash.el
archivo. Sin embargo, no puedo ver ninguna superposición enscimax-ob-flycheck.org
(conscimax-ob-flycheck-mode
activado), ni cuando lo usoorg-edit-special
.El código superior agrega una función para evaluar todos los bloques de origen en el búfer que coincide con su archivo "init.org". El nombre del archivo se puede modificar según lo necesite.
fuente
RESULTS
bloques. Flycheck permanece inutilizable.emacs-lisp predicate:nil
flycheck-verify-setup
debido al hecho de quebuffer-file-name
estánil
en losOrg Src
buffers.buffer-file-name
en un archivo falso temporal. Pero si desea desactivar flycheck, creo que desactivar es una buena solución.