¿Es posible instrumentar un archivo de configuración alfabetizado en modo Org con un archivo Emacs Lisp de respaldo?

7

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 .elarchivo 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 .elarchivo 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-editbú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.

Matthew Piziak
fuente
Puede evaluar todos los bloques elisp src cuando abra este archivo. agregue un gancho en find-file-hooketc. para detectar si se abre el archivo de configuración de emacs
stardiviner
@stardiviner ¿Estaría dispuesto a ampliar su comentario en una respuesta? Tal como está, no tengo suficiente contexto para entender su solución propuesta.
Matthew Piziak el

Respuestas:

2

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 Antes de scimax-ob-flycheck

Después de activar scimax-ob-flycheck-mode, parece que:

Después de activar el modo scimax-ob-flycheck-mode

John Kitchin
fuente
Tenga en cuenta que para algo como Flycheck, creo que sería completamente aceptable si solo estuviera activo cuando org-editse invoca. En ese caso, solo habría un modo activo para el búfer. Edité mi pregunta para agregar algunos matices allí.
Matthew Piziak
He creado una solución para esto en github.com/jkitchin/scimax/blob/master/scimax-ob-flycheck.org . Hace más o menos lo que describí anteriormente usando flycheck en un archivo proxy. Probablemente todavía haya algunos problemas, ¡pero hasta ahora funciona para mí!
John Kitchin
¡Esto es brillante! Sin embargo, tengo problemas para reproducirlo. He lanzado un 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.
Matthew Piziak
Debe guardar el archivo, que debe crear los archivos proxy, y luego ejecutar flycheck en ellos después de que el archivo haya sido revisado y las superposiciones deben transferirse. Mientras el archivo org está abierto, debe haber un archivo creado en el mismo directorio con una extensión hasd y .el md5, si observa eso, debería ver las superposiciones de flycheck allí. Si no, algo más está sucediendo. No he intentado esto con un emacs / setup de vainilla, tal vez puedas publicar tu init para eso y podría probarlo.
John Kitchin
Ok si. Puedo ver flychecksuperposiciones en el md5-hash.elarchivo. Sin embargo, no puedo ver ninguna superposición en scimax-ob-flycheck.org(con scimax-ob-flycheck-modeactivado), ni cuando lo uso org-edit-special.
Matthew Piziak
-2
 (defun org-literate-programming-eval-src-blocks ()
   "Auto evaluate Org buffer all source blocks to get a complete
 project environment when Literate Programming."
   (if (string= (buffer-name) "init.org")
       (org-babel-execute-buffer)))

 (add-hook 'find-file-hook #'org-literate-programming-eval-src-blocks :before)

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.

Stardiviner
fuente
Me temo que esto no hace nada excepto evaluar los bloques y agregar RESULTSbloques. Flycheck permanece inutilizable.
Matthew Piziak
flycheck parece funcionar bien para mí en modo org-edit para emacs-lisp. ¿Qué no hace por ti?
John Kitchin
@MatthewPiziak Si todos sus bloques de origen son bloques de emacs-lisp y se evalúan, entonces todo su código de elisp debería estar disponible para Emacs, flycheck lo sabrá. Y también, flycheck funciona bien en mi org-edit-src-block también.
stardiviner
@JohnKitchin @stardiviner Me sale emacs-lisp predicate:nil flycheck-verify-setupdebido al hecho de que buffer-file-nameestá nilen los Org Srcbuffers.
Matthew Piziak
Se puede establecer buffer-file-nameen un archivo falso temporal. Pero si desea desactivar flycheck, creo que desactivar es una buena solución.
stardiviner