Когда я просматриваю справку Emacs для функций через C-h f
, я часто хочу заглянуть в реализацию Elisp / C. Я хочу ввести view-mode
автоматически при доступе к исходному коду таким образом, чтобы избежать ненужных изменений. Есть ли ловушка или функция, которую я могу посоветовать для достижения этой цели?
10
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)
Ответы:
Обновление (после ночного сна): у этого ответа есть большой недостаток: он включается
view-mode
при переходе к любой функции, а не только к источникам Emacs. Это можно исправить, но лучше использовать ответ @phils .Поступая ,
C-h f describe-function RET
а затем читает исходный кодdescribe-function
я обнаружил , что он создает «кнопку» специального типа для ссылок на определения функций:help-function-def
.Запуск
zrgrep
с этой строкой ("help-function-def
") указал мне наhelp-mode.el.gz
.После всего этого мы можем заменить этот тип кнопки своим собственным (обратите внимание на комментарий в коде):
Насколько я могу судить, нет функции для добавления совета: Emacs использует
lambda
здесь. С другой стороны (как указано @rationalrevolt ) можно заменитьhelp-function
свойство типаhelp-function-def
кнопки:источник
button-type-get
иbutton-type-put
заменить лямбду своей собственной, которая пересылает к существующей лямбде.Вы можете использовать локальные переменные каталога, чтобы сделать исходные файлы Emacs доступными по умолчанию только для чтения. (См. Также C-hig
(emacs) Directory Variables
RET).Создайте файл с именем
.dir-locals.el
в корне дерева каталогов, которое вы хотите защитить, со следующим содержимым:Редактировать: Михал Политовски отмечает в комментариях, что включение
view-mode
таким образом проблематично, потому что когда вы увольняете буфер с qним, он также отключает режим, что означает, что при следующем посещении этого буфераview-mode
не будет включен.Редактировать 2: Константин предоставил решение этой проблемы в комментариях ниже:
Это полезно добавляет тест, чтобы убедиться, что буфер уже посещает файл, но ключевым изменением является использование
view-mode-enter
вместоview-mode
, так как первый принимаетEXIT-ACTION
аргумент, который определяет, что делать при qвводе. В этом случае действие выхода - уничтожить буфер, гарантируя, что при следующем посещении файла он снова окажется вview-mode
.Редактировать 3: Следуя этому пути, мы также можем видеть, что указанное
EXIT-ACTION
в конечном итоге передаетсяview-mode-exit
функции, и ее строка документации дает нам альтернативное решение:Следовательно, мы можем использовать следующее:
Я использую альтернативный подход, который вы можете полностью указать в вашем файле инициализации (в отличие от создания
.dir-locals.el
файла), и я просто делаю файлы только для чтения, а не использую ихview-mode
. Мой конфиг выглядит так:Очевидно, вы можете сделать то же самое для вашего каталога elpa и любого другого каталога, который содержит сторонний исходный код.
источник
.dir-locals.el
себя ...)find-file-hook
иread-only-dirs
списке, но мне нравится этот подход.((nil . ((eval . (view-mode 1)))))
что это самый простой способ , чтобыView-quit
убить буферы доступны через помощь? В противном случае после выхода из представления источника нажатием кнопкиq
буфер остается, и при последующем доступе к источникам из того же файла из справки снова режим просмотра не запускается.view-mode
.((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
(обратите внимание,(view-mode-enter ...)
вместо(view-mode 1)
). Таким образом , нажатиеq
убивает буфер иview-mode
будет включен в следующий раз , когда я посещаю один и тот же файл.Я думаю, что все, что вам нужно, это добавить крючок :
источник
view-mode
при переходе к любой функции, использующейC-h f
не только источники Emacs.find-THING
команды используют этот хук, а кнопки помощи обходят его.Это относится не к вашему конкретному случаю, а к более общему случаю переключения на
view-mode
всякий раз, когда вы посещаете исходный файл из буфера справки. Я предлагаю его в качестве альтернативы ответу @ Constantine, поскольку он не был читаемым в качестве комментария.Похоже, я изначально получил это из EmacsWiki .
источник
Вот решение, которое работает со встроенной документацией, и пример, показывающий, как распространить его на ELPA. Он работает путем сопоставления пути к текущему файлу с некоторыми регулярными выражениями и применения,
read-only-mode
если какой-либо из них совпадает.Обратите внимание, что буфер доступен только для чтения, если вы просматриваете его
dired
также, а не только через справку.Я добавил хук, который запускается после ввода,
emacs-lisp-mode
который проверяет, совпадает ли путь к файлу/\.el\.gz$/
, и применяет режим только для чтения, если это так.Вот пример, который также проверяет ELPA, используя эвристику, согласно которой любой путь, содержащийся
.emacs.d/elpa
на самом деле, является кодом ELPA.источник