Ви можете використовувати локальні змінні для каталогу, щоб зробити вихідні файли Emacs за замовчуванням лише для читання. (Див. Також C-hig (emacs) Directory Variables RET).
Створіть файл, названий .dir-locals.elу корені дерева каталогів, який ви хочете захистити, із таким вмістом:
((nil . ((eval . (view-mode 1)))))
Редагувати: Michał Politowski вказує в коментарях, що включити 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функції, і його docstring дає нам альтернативне рішення:
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))))))
Я використовую альтернативний підхід, який ви можете повністю вказати у своєму файлі init (на відміну від створення .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)