这是我的init.el文件的一部分,它启用了clojure模式的一个钩子:
(use-package clojure-mode
:ensure t
:config (add-hook 'clojure-mode-hook #'aggressive-indent-mode))
启用多个挂钩的语法是什么(例如#' paredit-mode以及更多)?
答案 0 :(得分:3)
正如@ArthurUlfeldt所指出的,你可以添加多个add-hook语句,每个语句对应你想要添加的每个钩子函数。但是,如果您想要添加到多种模式的常见事物,这可能会变得有点烦人。
例如,如果您使用多种类似于lisp的语言,那么您可能希望为这些模式中的每一种添加paredit,aggressive-indent,eldoc,rainbow-delimiters等。您可以定义自己的函数,即my-lisp-hook,它可以调用您使用单独的add-hook命令添加的所有init函数,而不必在init文件中添加大量的add-hook命令。然后你只需要做一个调用你的函数的add-hook。
这可以带来的另一个好处是它可以更轻松地添加/删除新的次要模式。例如,如果你有
(defun my-lisp-hook ()
(paredit-mode 1)
(aggressive-indent-mode 1)
(raindbow-delimiter-mode 1))
然后
(add-hook 'emacs-lisp-mode-hook 'my-lisp-hook)
(add-hook 'lisp-mode-hook 'my-lisp-hook)
(add-hook 'clojure-mode-hook 'my-lisp-hook)
(add-hook 'cider-mode-hook 'my-lisp-hook)
然后在ELPA包更新后发现新版本的aggressive-indent-mode导致了问题,你可以在my-lisp-hook函数中注释掉1行来停止对aggressive-indent-mode的调用回去工作。另一方面,如果你在每个模式钩子中单独添加它,你就可以注释掉4行。它也保持一致。当我为一种模式在一个订单中加载次要模式而在另一种模式下加载不同的订单时,我遇到了一些微妙的问题。通过使用您自己的钩子函数来加载常见的设置要求,这一切都是一致的。
请注意,上面的代码是伪代码,并不意味着实际运行。我不知道打开彩虹分隔符的命令是否为rainbow-delimiters-mode 1,或者用于lisp模式的右钩子是否是lisp-mode-hook。我的例子只是为了证明这个概念。
您编写emacs init文件的方式是个人选择,但我认为您应该应用我们都知道应该应用于编写代码的相同规则。其中两个是“不会让自己受到重创”。并且'编写代码以使其清晰而不是聪明。我想我们将相同的逻辑应用于我们的emacs init文件。
我也认为你的使用包开始了一个很好的开始。我刚刚切换到使用它,并认为这是一种帮助构建init文件的好方法。但是,为了充分利用它,特别是关于延迟加载包以便减少启动时间,我确实发现我必须重新调整我的初始化文件。这可能仅仅是一个标志,我的原始结构不是那么好,或者它可能表明我目前对尝试和调整我的emacs配置感兴趣,因为它有点浪费/分心切割实际代码,往往导致结果由于不断变化,在较少的结构初始化。
答案 1 :(得分:2)
您可以在:config关键字后添加多个语句:
(use-package clojure-mode
:ensure t
:config (add-hook 'clojure-mode-hook #'aggressive-indent-mode)
(add-hook 'clojure-mode-hook #'other-thing-here)
(yas-global-mode 1))
这是我的配置中的一个块:
(use-package cider
:ensure t
:config
(define-key cider-mode-map (kbd "C-c SPC") 'avy-goto-word-1)
(define-key cider-mode-map (kbd "C-x SPC") 'avy-pop-mark))