Вы можете использовать локальные переменные каталога, чтобы сделать исходные файлы Emacs доступными по умолчанию только для чтения. (См. Также C-hig (emacs) Directory Variables
RET).
Создайте файл с именем .dir-locals.el
в корне дерева каталогов, которое вы хотите защитить, со следующим содержимым:
((nil . ((eval . (view-mode 1)))))
Редактировать: Михал Политовски отмечает в комментариях, что включение view-mode
таким образом проблематично, потому что когда вы увольняете буфер с qним, он также отключает режим, что означает, что при следующем посещении этого буфера view-mode
не будет включен.
Редактировать 2: Константин предоставил решение этой проблемы в комментариях ниже:
((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
Это полезно добавляет тест, чтобы убедиться, что буфер уже посещает файл, но ключевым изменением является использование view-mode-enter
вместо view-mode
, так как первый принимает EXIT-ACTION
аргумент, который определяет, что делать при qвводе. В этом случае действие выхода - уничтожить буфер, гарантируя, что при следующем посещении файла он снова окажется в view-mode
.
Редактировать 3: Следуя этому пути, мы также можем видеть, что указанное EXIT-ACTION
в конечном итоге передается view-mode-exit
функции, и ее строка документации дает нам альтернативное решение:
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.
Следовательно, мы можем использовать следующее:
((nil . ((eval . (when buffer-file-name
(setq-local view-no-disable-on-exit t)
(view-mode-enter))))))
Я использую альтернативный подход, который вы можете полностью указать в вашем файле инициализации (в отличие от создания .dir-locals.el
файла), и я просто делаю файлы только для чтения, а не использую их view-mode
. Мой конфиг выглядит так:
;; 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)
Очевидно, вы можете сделать то же самое для вашего каталога elpa и любого другого каталога, который содержит сторонний исходный код.
emacs-lisp-mode
и я просто делаю,C-x C-q
если я хочу редактировать исходный код.(defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)