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.el
w 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-mode
w 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-mode
nie 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-enter
zamiast view-mode
, ponieważ ten pierwszy przyjmuje EXIT-ACTION
argument, 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-ACTION
jest ostatecznie przekazywany do view-mode-exit
funkcji, 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.el
pliku), 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-mode
i robię to,C-x C-q
jeś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)