Możesz użyć zmiennych lokalnych katalogu, aby pliki źródłowe Emacsa były domyślnie tylko do odczytu. (Zobacz także C-hig (emacs) Directory Variables RET).
Utwórz plik o nazwie .dir-locals.elw katalogu głównym drzewa katalogów, który chcesz chronić, z następującą zawartością:
((nil . ((eval . (view-mode 1)))))
Edycja: Michał Politowski wskazuje w komentarzach, że włączenie view-modew ten sposób jest problematyczne, ponieważ po zwolnieniu bufora z qnim wyłącza również tryb, co oznacza, że przy następnej wizycie bufor view-modenie zostanie włączony.
Edycja 2: Constantine podał rozwiązanie tego problemu w komentarzach poniżej:
((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
Przydatnie dodaje to test, aby upewnić się, że bufor już odwiedza plik, ale kluczową zmianą jest użycie view-mode-enterzamiast view-mode, ponieważ ten pierwszy przyjmuje EXIT-ACTIONargument, który określa, co zrobić, gdy qzostanie wpisany. W takim przypadku czynnością wyjścia jest zabicie bufora, zapewniając, że przy następnej wizycie plik ponownie się skończy view-mode.
Edycja 3: Podążając tą ścieżką, możemy również zobaczyć, że określony EXIT-ACTIONjest ostatecznie przekazywany do view-mode-exitfunkcji, a jego dokumentacja daje nam alternatywne rozwiązanie:
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.
Dlatego możemy użyć następujących elementów:
((nil . ((eval . (when buffer-file-name
(setq-local view-no-disable-on-exit t)
(view-mode-enter))))))
Korzystam z alternatywnego podejścia, które możesz określić w całości w pliku init (w przeciwieństwie do tworzenia .dir-locals.elpliku), i po prostu zmieniam pliki na tylko do odczytu, zamiast ich używać view-mode. Moja konfiguracja wygląda następująco:
;; 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)
Oczywiście możesz zrobić to samo dla swojego katalogu elpa i każdego innego katalogu zawierającego kod źródłowy innej firmy.
emacs-lisp-modei robię to,C-x C-qjeśli chcę edytować kod źródłowy.(defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)