Vous pouvez utiliser des variables locales de répertoire pour rendre les fichiers source d'Emacs en lecture seule par défaut. (Voir aussi C-hig (emacs) Directory Variables
RET).
Créez un fichier appelé .dir-locals.el
à la racine de l'arborescence de répertoires que vous souhaitez protéger, avec le contenu suivant:
((nil . ((eval . (view-mode 1)))))
Edit: Michał Politowski souligne dans les commentaires que l'activation view-mode
de cette manière est problématique, car lorsque vous supprimez le tampon avec lui, qcela désactive également le mode, ce qui signifie que la prochaine fois que vous visiterez ce tampon view-mode
ne sera pas activé.
Edit 2: Constantine a fourni une solution à ce problème dans les commentaires ci-dessous:
((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
Cela ajoute utilement un test pour s'assurer que le tampon visite déjà un fichier, mais le changement de clé est l'utilisation de view-mode-enter
au lieu de view-mode
, car le premier prend un EXIT-ACTION
argument qui détermine ce qu'il faut faire quand il qest tapé. Dans ce cas, l'action de sortie consiste à tuer le tampon, en s'assurant que la prochaine fois que le fichier sera visité, il se retrouvera à nouveau view-mode
.
Edit 3: En suivant ce chemin, nous pouvons également voir que le spécifié EXIT-ACTION
est finalement transmis à la view-mode-exit
fonction, et sa docstring nous donne une solution alternative:
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.
Par conséquent, nous pouvons utiliser les éléments suivants:
((nil . ((eval . (when buffer-file-name
(setq-local view-no-disable-on-exit t)
(view-mode-enter))))))
J'utilise l'approche alternative que vous pouvez spécifier entièrement dans votre fichier init (par opposition à la création d'un .dir-locals.el
fichier), et je fais simplement les fichiers en lecture seule plutôt que d'utiliser view-mode
. Ma configuration ressemble à ceci:
;; 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)
Évidemment, vous pouvez faire la même chose pour votre répertoire elpa et tout autre répertoire contenant du code source tiers.
emacs-lisp-mode
et je fais justeC-x C-q
si je veux modifier le code source.(defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)