如何一次将钩子应用于多个Emacs模式?

时间:2011-09-13 07:23:26

标签: emacs elisp

我正在阅读article about well-formatted Git commits,我想知道如何将一些规则应用于Magit日志模式。

似乎同时使用3种主要模式:MagitLogEdit

那么,当我们一起使用这些模式时,如何自动硬包装72个字符?

5 个答案:

答案 0 :(得分:8)

在回答原始陈述的问题时,如果你有一个函数要添加到众多钩子变量中,你可以这样做:

(defun my-add-to-multiple-hooks (function hooks)
  (mapc (lambda (hook)
          (add-hook hook function))
        hooks))

(defun my-turn-on-auto-fill ()
  (setq fill-column 72)
  (turn-on-auto-fill))

(my-add-to-multiple-hooks
 'my-turn-on-auto-fill
 '(text-mode-hook
   magit-log-edit-mode-hook
   change-log-mode-hook))

也许不是最好的例子,但是我在编程模式中想要启用的一些常见行为有类似的东西,其中还有很多要列出的内容。

答案 1 :(得分:4)

Emacs缓冲区中只能有一种主要模式(除非您使用something like MMM or MuMaMo)。在您的情况下,一个主要模式是magit-log-edit-mode,其名称由三个单词组成(“Magit Log Edit”)。您可以随意添加任何钩子:

(defun my-turn-on-auto-fill ()
  (setq fill-column 72)
  (turn-on-auto-fill))

(add-hook 'magit-log-edit-mode-hook 'my-turn-on-auto-fill)

答案 2 :(得分:4)

Emacs模式具有“基本模式”,即bade模式。例如python-mode扩展prog-modefundamental-mode扩展fundamental-mode。所有模式都延伸python-mode。因此,要挂钩c-modetext-mode而不是prog-mode,您可以挂钩{{1}}。

答案 3 :(得分:2)

通常,您可以定义自己的函数,例如my-common-hook并将其添加到所有主要模式,例如:

(defun my-common-hook ()
   ... do stuff ...
   )
(add-hook 'one-mode-hook 'my-common-hook)
(add-hook 'another-mode-hook 'my-common-hook)
(add-hook 'a-third-mode-hook 'my-common-hook)

答案 4 :(得分:1)

现在看到这个,但这就是我所做的。最终结果是我想要做以下事情: (hook-up-modes my-lisps 'standard-lisp-environment)

为此,我定义了以下defvar s。

(defvar my-lisps  "clojure lisp emacs-lisp cider-repl")
(defun standard-lisp-environment ()
  (paredit-mode 1)
  (rainbow-delimiters-mode 1)
  (eldoc-mode 1))

我想让lisp附加-mode-hook到我使用的lisps所以我有以下内容:

(defun append-suffix (suffix phrases)
  "take SUFFIX and append it to each of the PHRASES."
  (mapcar #'(lambda (phrase) (concat phrase suffix)) phrases))

这样(“clojure”“lisp”)=> (“clojure-mode-hook”“lisp-mode-hook”)。

现在我们可以很容易地拥有这些,我们需要他们的读者符号,我们很容易从

获得
(defun symbols-from-strings (strings)
  "Given a list of strings, get their symbol values"
  (mapcar #'intern strings))

最后我们在上面发布了类似的表格:

(defun multiple-mode-add-hook (modes hook)
  "Given a list of x-mode-hook symbols in MODE, add the HOOK to them."
  (mapc (lambda (mode) (add-hook mode hook)) modes))

这些操作都是对它们有意义的类型,字符串列表,符号列表'blah-mode-hook等等。所以现在我们需要一个很好的面向用户的功能,我们可以使用它。

(defun hook-up-modes (strings hook)
  (let ((modes (symbols-from-strings
                (append-suffix "-mode-hook" (split-string strings)))))
    (multiple-mode-add-hook modes hook)))

现在这应该是非常清晰的:我们从空格分隔的字符串列表创建我们的模式并将钩子应用于它。此外,由于我已经定义了一个标准的lisp环境,我的所有lisps行为都相似,如果我愿意,我可以在以后轻松删除钩子。那么实际工作的代码就是超级简单的短语 (hook-up-modes my-lisps 'standard-lisp-environment)