19

トピックに関するこの質問を見つけましたが、[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)

私の質問は 2 つあります。

  1. メジャーモードと同様に、これを行う簡単な方法はありますか?
  2. そうでない場合、フックの関数をどのように記述しますか?
    1. 正規表現に対してファイル パスをチェックする必要があります。
    2. 一致する場合は、目的のモードを有効にします (例: 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))))
4

2 に答える 2

15

Trey Jackson の回答は非常に堅牢で拡張可能なソリューションのようですが、私はもっとシンプルなものを探していました。次のコードは、ファイルhmmm-modeを編集するときに架空のものを有効にします。.hmmm

(add-hook 'find-file-hook
          (lambda ()
            (when (string= (file-name-extension buffer-file-name) "hmmm")
              (hmmm-mode +1))))
于 2016-09-23T03:42:45.647 に答える
14

このコードはあなたが望むものを与えるようです:

(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

于 2012-12-19T05:53:18.913 に答える