emacs + clojure 模式 : add multiple hooks

标签 emacs clojure

这是我的 init.el 文件的一部分,它启用了 clojure 模式的一个钩子(Hook):

(use-package clojure-mode
  :ensure t
  :config (add-hook 'clojure-mode-hook #'aggressive-indent-mode))

启用多个 Hook 的语法是什么(例如#'paredit-mode 以及更多)?

最佳答案

正如 @ArthurUlfeldt 指出的,您可以添加多个 add-hook 语句,一个对应于您要添加的每个钩子(Hook)函数。然而,当您想要将一组通用的内容添加到多个模式时,这可能会变得有点烦人。

例如,如果您使用多种类似 lisp 的语言,那么您可能需要向每种模式添加 paredit、aggressive-indent、eldoc、rainbow-delimiters 等。您不必在整个 init 文件中散布大量 add-hook 命令,您可以定义自己的函数,即 my-lisp-hook ,它调用您使用单独的 add-hook 命令添加的所有 init 函数。然后你只需要做一个调用你的函数的添加钩子(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 的调用,并且回去工作。另一方面,如果您在每个模式 Hook 中单独添加它,则必须注释掉 4 行。它还可以保持事物的一致性。当我以一种顺序加载一种模式的次要模式并为另一种模式加载不同的顺序时,我遇到了一些微妙的问题。通过使用您自己的 Hook 函数来加载常见的设置要求,这一切都会一致发生。

请注意,上面的代码是伪代码,并不意味着实际运行。我不知道打开彩虹分隔符的命令是否是 Rainbow-delimiters-mode 1 或者用于 lisp 模式的右钩子(Hook)是否是 lisp-mode-hook。我的例子只是为了演示这个概念。

编写 emacs init 文件的方式是个人选择,但我认为您应该应用我们都知道应该应用于编写代码的相同规则。其中两个是“不要重复自己”和“编写清晰而不是聪明的代码”。我认为我们应该对 emacs init 文件应用相同的逻辑。

我还认为您使用 use-package 有了一个良好的开端。我刚刚转而使用它,并认为这是帮助构建 init 文件的好方法。然而,为了充分利用它,特别是延迟加载软件包以减少启动时间,我确实发现我必须稍微重组我的初始化文件。这可能只是表明我原来的结构不是那么好,也可能表明我目前有兴趣尝试和调整我的 emacs 配置,作为一种爱好/从切割实际代码中分心,这往往会导致由于不断变化,结构初始化较少。

关于emacs + clojure 模式 : add multiple hooks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36092613/

相关文章:

svn - 防止 emacs 命令在其他窗口中显示新缓冲区

emacs - Sublime Text 2's "Goto Anything”(或即时搜索)用于 Emacs?

Emacs init.el 和 Elisp 以及普通 lisp every-p 函数的等价物

clojure - 如何配置 leiningen 以使用最新的 Clojure 版本来在项目之外启动 repl?

clojure - 在 clojure 原子交换中执行副作用的正确方法是什么

emacs - 在 emacs term-mode 中禁用包

java - 如何在知道包的情况下使 Lisp 函数调用 java?

macros - Clojure:是否可以创建一个宏来在单个 condp 子句中创建两个元素?

Clojure - 重置!原子导致堆栈溢出

java - 如何从 Java 调用 Clojure 宏?