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-mode
automá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-mode
y solo lo hagoC-x C-q
si 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-mode
al 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 RET
y luego leer el código fuente de ladescribe-function
que descubrió que crea un "botón" de un tipo especial para los enlaces a las definiciones de funciones:help-function-def
.Correr
zrgrep
con 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
lambda
aquí. Por otro lado (como lo señaló @rationalrevolt ) se puede reemplazar lahelp-function
propiedad delhelp-function-def
tipo de botón:fuente
button-type-get
ybutton-type-put
reemplazar 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 Variables
RET)Cree un archivo llamado
.dir-locals.el
en 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-mode
de 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-mode
no 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-enter
lugar deview-mode
, ya que el primero toma unEXIT-ACTION
argumento 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-ACTION
finalmente se pasa a laview-mode-exit
funció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.el
archivo), 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.el
mí y me uso a mí mismo ...)find-file-hook
unaread-only-dirs
lista, pero me gusta este enfoque.((nil . ((eval . (view-mode 1)))))
¿ Con cuál es la forma más sencilla deView-quit
matar 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, presionarq
mata el búfer yview-mode
se habilita la próxima vez que visite el mismo archivo.Creo que todo lo que necesitas es agregar un gancho :
fuente
view-mode
al navegar a cualquier función usandoC-h f
, no solo las fuentes de Emacs.find-THING
comandos 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-mode
cada 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-mode
si alguna de ellas coincide.Tenga en cuenta que el búfer es de solo lectura si lo visita
dired
también, no solo a través de la ayuda.Agregué un gancho que se ejecuta después de ingresar
emacs-lisp-mode
que 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/elpa
es en realidad código ELPA.fuente