Как использовать одно и то же расширение файла в разных режимах?
У меня есть файлы с.new
расширения, которые содержат код LaTeX (они являются результатом работы программы, которая делает что-то на исходном.tex
источник).
Чтобы проверить их, мне нужно, чтобы в них был выделен синтаксис LaTeX и чтобы их можно было открывать в режиме только для чтения, чтобы избежать появления ошибок. Поэтому я поместил эти строки в свой.emacs
:
(setq auto-mode-alist
(append '(("\\.new\\'" . read-only-mode)
("\\.new\\'" . latex-mode))
auto-mode-alist))
Но это не работает должным образом, потому что применяется только первый режим. Как я могу заставить emacs применять обаread-only-mode
иlatex-mode
с тем же расширением файла?
2 ответа
Не уверен, что смогу дать ответ, но вот некоторые вещи, которые следует учитывать:
-
read-only-mode
является второстепенным режимом, в то время как -
auto-mode-alist
предназначена для включения основных режимов. Для основных режимов имеет смысл использовать только один. - Вы можете поставить что-то вроде
-*- buffer-read-only: t; -*-
в вашей первой строке в файле (возможно, за некоторыми комментариями или шебангами, в зависимости от типа файла), что включит режим только для чтения. Возможно, автоматизируйте это, используяauto-insert-alist
и соответствовать.new
шаблон имени файла. - На https://www.reddit.com/r/emacs/comments/jqxgiz/how_can_i_make_some_files_automatically_readonly/ есть несколько хороших предложений , а именно попробовать файловые локальные переменные и использовать
find-file-hook
Надеюсь, что-то из этого поможет.
Простое решение — связать расширение вашего файла с пользовательским производным основным режимом:
(define-derived-mode read-only-latex-mode latex-mode "LaTeX"
"Major mode for viewing files of input for LaTeX."
(read-only-mode 1))
(add-to-list 'auto-mode-alist '("\\.new\\'" . read-only-latex-mode))
Новыйread-only-latex-mode
делает все, что делает (включая запускlatex-mode-hook
если вы уже используете это), но это дополнительно позволяетread-only-mode
после выполнения всех действий родительского режима.
Любой другой код, который заботится о том, чтобы основной режим былlatex-mode
должны уже тестировать это, используя стандартный подход(derived-mode-p 'latex-mode)
что по-прежнему верно для этого нового режима; так что в принципе этот подход должен просто работать.