Emacs auto-minor-mode на основе расширения
Я нашел этот вопрос по этой теме, но есть ли способ [в emacs] установить второстепенный режим (или его список) на основе расширения? Например, довольно легко узнать, что основные режимы можно манипулировать так:
(setq auto-mode-alist
(cons '("\\.notes$" . text-mode)
auto-mode-alist))
и то, что я идеально хотел бы сделать, это
(setq auto-minor-mode-alist
(cons '("\\.notes$" . auto-fill-mode)
auto-minor-mode-alist))
В ответе на ответ связанного вопроса упоминаются перехватчики, в частности temp-buffer-setup-hook
. Чтобы использовать это, вам нужно добавить функцию на крючок, например:
(add-hook 'temp-buffer-setup-hook 'my-func-to-set-minor-mode)
Мой вопрос в два раза:
- Есть ли более простой способ сделать это, подобно основным режимам?
- Если нет, как бы написать функцию для крючка?
- Он должен проверить путь к файлу относительно регулярного выражения.
- Если он соответствует, активируйте нужный режим (например,
auto-fill-mode
).
Ошибка и ошибка при решении:
; Enables the given minor mode for the current buffer it it matches regex
; my-pair is a cons cell (regular-expression . minor-mode)
(defun enable-minor-mode (my-pair)
(if (buffer-file-name) ; If we are visiting a file,
; and the filename matches our regular expression,
(if (string-match (car my-pair) buffer-file-name)
(funcall (cdr my-pair))))) ; enable the minor mode
; used as
(add-hook 'temp-buffer-setup-hook
(lambda () (enable-minor-mode ("\\.notes$" . auto-fill-mode))))
Ответы
Ответ 1
Этот код, кажется, дает то, что вы хотите:
(defvar auto-minor-mode-alist ()
"Alist of filename patterns vs correpsonding minor mode functions, see `auto-mode-alist'
All elements of this alist are checked, meaning you can enable multiple minor modes for the same regexp.")
(defun enable-minor-mode-based-on-extension ()
"check file name against auto-minor-mode-alist to enable minor modes
the checking happens for all pairs in auto-minor-mode-alist"
(when buffer-file-name
(let ((name buffer-file-name)
(remote-id (file-remote-p buffer-file-name))
(alist auto-minor-mode-alist))
;; Remove backup-suffixes from file name.
(setq name (file-name-sans-versions name))
;; Remove remote file name identification.
(when (and (stringp remote-id)
(string-match-p (regexp-quote remote-id) name))
(setq name (substring name (match-end 0))))
(while (and alist (caar alist) (cdar alist))
(if (string-match (caar alist) name)
(funcall (cdar alist) 1))
(setq alist (cdr alist))))))
(add-hook 'find-file-hook 'enable-minor-mode-based-on-extension)
Примечание: сравнение выполняется с помощью string-match-p
, который следует за настройками case-fold-search
во время сравнения.
Ответ 2
Ответ Трей Джексона кажется очень надежным и расширяемым решением, но я искал что-то более простое. Следующий код будет включать вымышленный hmmm-mode
при редактировании файлов .hmmm
:
(add-hook 'find-file-hook
(lambda ()
(when (string= (file-name-extension buffer-file-name) "hmmm")
(hmmm-mode 1))))