《elisp 每日一练》——系统内置hook

《elisp 每日一练》——系统内置hook

Masimaro
2026-10-16 / 0 评论 / 1 阅读 / 正在检测是否收录...

在前面一篇文章我们讨论了hook的基本概念,以及Emacs 中添加、移除hook的方法。现在我们开始慢慢深入理解hook

背景知识

查找hook的一般方法

本文我们主要罗列Emacs系统中常用的hook,如果读者觉得啰嗦也可以跳过,在未来需要的时候,自己看文档。为了方便读者我们先谈谈查询自己想要的系统hook的一般方法。

第一种方法是,通过 apropos 按事件名称搜索。当我们想要在某个事件上注册hook,例如创建一个buffer、打开文件、关闭buffer,这种情况下最直接的方法就是让 Emacs 自己去找。

例如我想要看看与buffer相关的hook有哪些,可以输入 apropos 后面接着输入 buffer hook,就可以看到与buffer相关的hook。

第二种方法就是查询官方文档,可以在Emacs中使用 info 命令打开官方文档,在文档中导航到 Elisp --> Standard Hooks 但是文档中列举的hook太多了,适合我们在不确定具体的名称,但是有一个大概的记忆时使用

第三种方式,可以使用 describe-variable 命名,hook本质上是一个存储函数的列表变量,而且hook 一般会以事件或者触发的函数后面加上 -hook、-function 命名。例如 find-file-hook这种。我们可以尝试搜索一下对应的函数是否有类似的名称

第四种方式自然就是当今的AI了,它的使用就不多说了。

在了解了基本的查找方式之后,读者如果对下面的不感兴趣,可以跳过了,后面按照这些方式找到之后再在文档中详细了解。

常用hook

与 buffer 相关的hook有:

  • after-change-major-mode-hook: 当一个 Buffer 的 Major Mode 彻底加载并初始化完成后触发。如果我们想为对应的major mode 搭配一些小功能的 minor mode, 例如行号、高亮当前行,可以在hook函数中开启对应的 minor mode
  • kill-buffer-hook 当一个buffer被销毁时被调用。释放与该 Buffer 绑定的后台临时文件、定时器或子进程句柄,防止资源泄漏
  • kill-buffer-query-functions 在buffer即将被销毁前期调用,我们在上一篇的例子中使用过。

与 文件读写相关的hook

  • find-file-hook 当我们使用find-file 成功打开一个文件并且创建了对应的buffer 之后被调用。
  • before-save-hook 在文件正式被保存之前调用,我们可以用它来实现保存前格式化的操作
  • after-save-hook 在文件被成功保存到磁盘之后执行。我们可以实现保存自动编译、推送文章上传到博客之类的操作

与窗口布局相关的hook

  • window-configuration-change-hook 在窗口布局发生变化,例如分屏、关屏、调整窗口大小时触发。我们用它来调整某些工具栏的窗口大小

练习

在昨天的练习,我们实现了关闭buffer时自动保存的功能,现在我们实现一个在保存前自动清楚末尾空白行和行尾空白字符的操作。但是我们只想在编程语言中启用。

对于删除空白行和行尾多余的空格一个内置的函数 delete-trailing-whitespace。而编程语言的major mode 默认都是继承自 prog-mode,所以我们可以简单的使用 derived-mode-p 判断它是否继承自 prog-mode 来实现。

因此我们可以使用如下代码:

(defun my-auto-cleanup-whitespace ()
  "在文件保存前,自动清理当前 Buffer 行尾的多余空白字符。"
  (when (derived-mode-p 'prog-mode)
    (save-excursion
      (goto-char (point-min))
      (delete-trailing-whitespace))))

;; 将其挂载到全局 before-save-hook
(add-hook 'before-save-hook #'my-auto-cleanup-whitespace)

总结

本篇我们介绍了一些系统自带的hook、以及查阅它们的方式方法。目前ai普及的情况下,读者可以按照自己的需求使用ai帮忙查找对应的hook

0

评论 (0)

取消