现在我们来到开启文本模式与自动填充模式的部分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-mode。text-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)
本节给出的配置更适合文字写作者。 对于程序员,Emacs 会根据文件类型自动将默认模式设为对应的编程模式(prog-mode)。 如果你希望保留基础模式作为默认模式,也完全没有问题。
这里使用 setq-default 是因为 text-mode 是缓冲区局部变量。
如果使用 setq,设置只会作用于当前缓冲区;
而 setq-default 会同时作用于新建的缓冲区。
程序员通常不建议这样设置。