基于扩展的Emacs自动次要模式

时间:2012-12-19 04:57:18

标签: emacs elisp dot-emacs

我在这个主题上找到了this question,但有没有办法[在emacs中]基于扩展设置次要模式(或其列表)?例如,很容易发现主要模式可以像这样被操纵

(add-to-list 'auto-mode-alist '("\\.notes\\'" . text-mode))

我理想的是能够做到的是

(add-to-list 'auto-minor-mode-alist '("\\.notes\\'" . auto-fill-mode))

链接问题的接受答案提到了钩子,特别是temp-buffer-setup-hook。要使用它,你必须像钩子一样添加一个函数

(add-hook 'temp-buffer-setup-hook #'my-func-to-set-minor-mode)

我的问题是双重的:

  1. 有没有更简单的方法来执行此操作,类似于主要模式?
  2. 如果没有,怎么会为钩子编写函数?
    1. 需要根据正则表达式检查文件路径。
    2. 如果匹配,请激活所需的模式(例如auto-fill-mode)。

  3. 试图找到解决方案的虚弱和错误:

    ;; 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))))
    

2 个答案:

答案 0 :(得分:11)

此代码似乎给出了您想要的内容:

(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 (file-name-sans-versions buffer-file-name))
          (remote-id (file-remote-p buffer-file-name))
          (case-fold-search auto-mode-case-fold)
          (alist auto-minor-mode-alist))
      ;; 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-p (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之后进行的。

答案 1 :(得分:8)

Trey Jackson的答案似乎是一个非常强大且可扩展的解决方案,但我一直在寻找更简单的东西。编辑hmmm-mode文件时,以下代码将启用虚构的.hmmm

(add-hook 'find-file-hook
          (lambda ()
            (when (string= (file-name-extension buffer-file-name) "hmmm")
              (hmmm-mode +1))))