Подтвердить что ты не робот

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))))
4b9b3361

Ответ 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))))