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:
((nil . ((eval . (view-mode 1)))))
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úfer view-mode
no estará habilitado.
Edición 2: Constantine ha proporcionado una solución a ese problema en los comentarios a continuación:
((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
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 de view-mode
, ya que el primero toma un EXIT-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 terminar view-mode
.
Edición 3: Siguiendo esa ruta, también podemos ver que lo especificado EXIT-ACTION
finalmente se pasa a la view-mode-exit
función, y su cadena de documentos nos da una solución alternativa:
view-no-disable-on-exit is a variable defined in `view.el'.
Its value is nil
Documentation:
If non-nil, View mode "exit" commands don't actually disable View mode.
Instead, these commands just switch buffers or windows.
This is set in certain buffers by specialized features such as help commands
that use View mode automatically.
Por lo tanto, podemos usar lo siguiente:
((nil . ((eval . (when buffer-file-name
(setq-local view-no-disable-on-exit t)
(view-mode-enter))))))
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 usarlos view-mode
. Mi configuración se ve así:
;; Emacs
(dir-locals-set-class-variables
'emacs
'((nil . ((buffer-read-only . t)
(show-trailing-whitespace . nil)
(tab-width . 8)
(eval . (whitespace-mode -1))))))
(dir-locals-set-directory-class "/usr/local/src/emacs" 'emacs)
(dir-locals-set-directory-class "/usr/local/share/emacs" 'emacs)
(dir-locals-set-directory-class "/usr/share/emacs" 'emacs)
Obviamente, puede hacer lo mismo para su directorio elpa y cualquier otro directorio que contenga código fuente de terceros.
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)