Cuando busco la ayuda de Emacs para las funciones vía C-h f, a menudo quiero echar un vistazo a la implementación de Elisp / C. Quiero ingresar view-modeautomáticamente cuando accedo al código fuente de esta manera para evitar modificaciones innecesarias. ¿Hay algún gancho o función que pueda recomendar para lograr esto?
10

emacs-lisp-modey solo lo hagoC-x C-qsi quiero editar el código fuente.(defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)Respuestas:
Actualización (después de una noche de sueño): esta respuesta tiene una falla importante: se habilita
view-modeal navegar a cualquier función, no solo a las fuentes de Emacs. Esto se puede solucionar, pero es mejor usar la respuesta de @phils .Al hacer
C-h f describe-function RETy luego leer el código fuente de ladescribe-functionque descubrió que crea un "botón" de un tipo especial para los enlaces a las definiciones de funciones:help-function-def.Correr
zrgrepcon esta cadena ("help-function-def") me señalóhelp-mode.el.gz.Después de toda esta búsqueda, podemos reemplazar este tipo de botón con el nuestro (tenga en cuenta el comentario en el código):
Por lo que puedo decir, no hay ninguna función para agregar consejos: Emacs usa un
lambdaaquí. Por otro lado (como lo señaló @rationalrevolt ) se puede reemplazar lahelp-functionpropiedad delhelp-function-deftipo de botón:fuente
button-type-getybutton-type-putreemplazar el lambda con el mío que reenvía al lambda existente.Puede usar variables locales de directorio para hacer que los archivos fuente de Emacs sean de solo lectura de manera predeterminada. (Ver también C-hig
(emacs) Directory VariablesRET)Cree un archivo llamado
.dir-locals.elen la raíz del árbol de directorios que desea proteger, con el siguiente contenido:Editar: Michał Politowski señala en los comentarios que habilitar
view-modede esta manera es problemático, porque cuando descarta el búfer con qél también deshabilita el modo, lo que significa que la próxima vez que visite ese búferview-modeno estará habilitado.Edición 2: Constantine ha proporcionado una solución a ese problema en los comentarios a continuación:
Esto agrega útilmente una prueba para garantizar que el búfer ya esté visitando un archivo, pero el cambio de clave es el uso de en
view-mode-enterlugar deview-mode, ya que el primero toma unEXIT-ACTIONargumento que determina qué hacer cuando qse escribe. En este caso, la acción de salida es matar el búfer, asegurando que la próxima vez que se visite el archivo vuelva a terminarview-mode.Edición 3: Siguiendo esa ruta, también podemos ver que lo especificado
EXIT-ACTIONfinalmente se pasa a laview-mode-exitfunción, y su cadena de documentos nos da una solución alternativa:Por lo tanto, podemos usar lo siguiente:
Utilizo el enfoque alternativo que puede especificar completamente en su archivo de inicio (en lugar de crear un
.dir-locals.elarchivo), y simplemente hago que los archivos sean de solo lectura en lugar de usarlosview-mode. Mi configuración se ve así:Obviamente, puede hacer lo mismo para su directorio elpa y cualquier otro directorio que contenga código fuente de terceros.
fuente
.dir-locals.elmí y me uso a mí mismo ...)find-file-hookunaread-only-dirslista, pero me gusta este enfoque.((nil . ((eval . (view-mode 1)))))¿ Con cuál es la forma más sencilla deView-quitmatar a los buffers a los que se accede mediante ayuda? De lo contrario, después de salir de la vista de origen presionandoq, el búfer se queda atrás y cuando se accede a las fuentes desde el mismo archivo desde la ayuda nuevamente, el modo de vista no se inicia.view-mode.((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))(note en(view-mode-enter ...)lugar de(view-mode 1)). De esta manera, presionarqmata el búfer yview-modese habilita la próxima vez que visite el mismo archivo.Creo que todo lo que necesitas es agregar un gancho :
fuente
view-modeal navegar a cualquier función usandoC-h f, no solo las fuentes de Emacs.find-THINGcomandos interactivos utilizan este enlace, y los botones de ayuda lo omiten.Esto no trata su caso específico, sino el caso más general de cambiar
view-modecada vez que visita un archivo fuente desde un búfer de ayuda. Lo estoy ofreciendo como una alternativa a la respuesta de @ Constantine, ya que no era legible como comentario.Parece que originalmente obtuve esto de EmacsWiki .
fuente
Aquí hay una solución que funciona para la documentación incorporada y un ejemplo que muestra cómo extenderla a ELPA. Funciona haciendo coincidir la ruta del archivo actual con algunas expresiones regulares y aplicando
read-only-modesi alguna de ellas coincide.Tenga en cuenta que el búfer es de solo lectura si lo visita
diredtambién, no solo a través de la ayuda.Agregué un gancho que se ejecuta después de ingresar
emacs-lisp-modeque comprueba si la ruta del archivo coincide/\.el\.gz$/y aplica el modo de solo lectura si lo hace.Aquí hay un ejemplo que también comprueba ELPA, utilizando la heurística de que cualquier ruta que contenga
.emacs.d/elpaes en realidad código ELPA.fuente