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.elen 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-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úfer view-modeno 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-enterlugar de view-mode, ya que el primero toma un EXIT-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 terminar view-mode.
Edición 3: Siguiendo esa ruta, también podemos ver que lo especificado EXIT-ACTIONfinalmente se pasa a la view-mode-exitfunció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.elarchivo), 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-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)