Puoi utilizzare le variabili locali della directory per rendere i file sorgente di Emacs di sola lettura per impostazione predefinita. (Vedi anche C-hig (emacs) Directory Variables
RET).
Creare un file chiamato .dir-locals.el
nella radice dell'albero delle directory che si desidera proteggere, con i seguenti contenuti:
((nil . ((eval . (view-mode 1)))))
Modifica: Michał Politowski sottolinea nei commenti che abilitare view-mode
in questo modo è problematico, perché quando si elimina il buffer con qesso disabilita anche la modalità, il che significa che la prossima volta che si visita quel buffer view-mode
non sarà abilitato.
Modifica 2: Costantino ha fornito una soluzione a questo problema nei commenti seguenti:
((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
Questo aggiunge utilmente un test per assicurarsi che il buffer stia già visitando un file, ma la modifica della chiave è l'uso di view-mode-enter
invece di view-mode
, poiché il primo accetta un EXIT-ACTION
argomento che determina cosa fare quando qviene digitato. In questo caso, l'azione di uscita consiste nell'uccidere il buffer, assicurandosi che alla successiva visita del file finisca nuovamente view-mode
.
Modifica 3: Seguendo quel percorso, possiamo anche vedere che lo specifico EXIT-ACTION
viene infine passato alla view-mode-exit
funzione e il suo docstring ci offre una soluzione 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.
Quindi possiamo usare quanto segue:
((nil . ((eval . (when buffer-file-name
(setq-local view-no-disable-on-exit t)
(view-mode-enter))))))
Uso un approccio alternativo che puoi specificare interamente nel tuo file init (invece di creare un .dir-locals.el
file), e faccio semplicemente i file in sola lettura piuttosto che usare view-mode
. La mia configurazione è simile a questa:
;; 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)
Ovviamente puoi fare la stessa cosa per la tua directory elpa e qualsiasi altra directory che contiene codice sorgente di terze parti.
emacs-lisp-mode
e lo faccio soloC-x C-q
se voglio modificare il codice sorgente.(defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)