16.4 文本模式与自动填充模式

现在我们来到开启文本模式与自动填充模式的部分20

;;; 文本模式与自动填充模式
;; 下面两行将 Emacs 设为文本模式
;; 和自动填充模式,适用于需要撰写散文
;; 而非编写代码的写作者。
(setq-default major-mode 'text-mode)
(add-hook 'text-mode-hook 'turn-on-auto-fill)

这是 .emacs 文件中第一部分真正做事情、而不只是提醒健忘用户的配置!

括号内两行配置中的第一行告诉 Emacs:打开文件时启用文本模式,除非该文件本应进入其他模式,例如 C 语言模式。

Emacs 读取文件时,会查看文件名后缀(如果有的话)。(后缀是 ‘.’ 后面的部分。)如果文件以 ‘.c’ 或 ‘.h’ 结尾,Emacs 会启用 C 模式。此外,Emacs 还会查看文件第一行非空内容;如果该行是 ‘-*- C -*-,Emacs 也会启用 C 模式。Emacs 内置了一份后缀与模式对应表,会自动据此选择模式。除此之外,Emacs 还会在文件末尾附近查找缓冲区局部变量列表(如果存在)。

现在回到 .emacs 文件。

我们再看这一行;它是如何工作的?

(setq-default major-mode 'text-mode)

这一行是简短但完整的 Emacs Lisp 表达式。

我们已经熟悉 setq。这里使用类似的宏 setq-default 来设置变量 major-mode21,将其值设为 text-modetext-mode 前面的单引号告诉 Emacs 直接处理符号本身,而不是它可能代表的值。 See Setting the Value of a Variable,可回顾 setq 的用法。核心要点是:在 .emacs 中设置变量的方式,与在 Emacs 其他任何地方完全相同。

再看下一行:

(add-hook 'text-mode-hook 'turn-on-auto-fill)

这一行中,add-hook 命令将 turn-on-auto-fill 添加到钩子变量中。

turn-on-auto-fill 就是一个程序的名字,顾名思义,它用于启用自动填充模式。

每次 Emacs 启用文本模式时,都会运行挂载在文本模式钩子上的命令。因此每次启用文本模式时,Emacs 也会同时启用自动填充模式。

简单来说,第一行让 Emacs 在编辑文件时进入文本模式,除非文件名后缀、文件首行或局部变量指定了其他模式。

文本模式还会做一件事:将语法表调整为更适合写作者的形式。在文本模式下,Emacs 会将撇号视为单词的一部分,就像字母一样;但不会把句点或空格当作单词的一部分。因此 M-f 会跳过整个 ‘it's’。而在 C 模式中,M-f 只会停在 ‘it's’ 中的 ‘t’ 后面。

第二行让 Emacs 在启用文本模式时自动开启自动填充模式。在自动填充模式下,Emacs 会自动将过长的行换行,把超出宽度的部分移到下一行。Emacs 会在单词之间换行,而不会从单词中间断开。

关闭自动填充模式时,输入的文本会一直向右延伸。根据 truncate-lines 的设置,超出屏幕的内容要么直接在屏幕右侧消失,要么以难看、难以阅读的折行形式显示在屏幕上。

此外,在我的 .emacs 这一部分,我还让 Emacs 的填充命令在冒号后插入两个空格:

(setq colon-double-space t)

Footnotes

(20)

本节给出的配置更适合文字写作者。 对于程序员,Emacs 会根据文件类型自动将默认模式设为对应的编程模式(prog-mode)。 如果你希望保留基础模式作为默认模式,也完全没有问题。

(21)

这里使用 setq-default 是因为 text-mode 是缓冲区局部变量。 如果使用 setq,设置只会作用于当前缓冲区; 而 setq-default 会同时作用于新建的缓冲区。 程序员通常不建议这样设置。