最后介绍一个我非常喜欢的功能:自定义模式行。
在网络上工作时,我经常忘记当前所在主机;也常常搞不清当前位置和光标所在行号。
因此我将模式行重设为如下样式:
-:-- foo.texi rattlesnake:/home/bob/ Line 1 (Texinfo Fill) Top
表示正在编辑主机 rattlesnake 上 /home/bob 目录下的 foo.texi 文件,当前在第 1 行,Texinfo 模式,位于缓冲区顶部。
我的 .emacs 中相关配置如下:
;; 设置模式行,显示主机、目录、行号
;; 以及其他常用信息
(setq-default mode-line-format
(quote
(#("-" 0 1
(help-echo
"mouse-1: select window, mouse-2: delete others ..."))
mode-line-mule-info
mode-line-modified
mode-line-frame-identification
" "
mode-line-buffer-identification
" "
(:eval (substring
(system-name) 0 (string-match "\\..+" (system-name))))
":"
default-directory
#(" " 0 1
(help-echo
"mouse-1: select window, mouse-2: delete others ..."))
(line-number-mode " Line %l ")
global-mode-string
#(" %[(" 0 6
(help-echo
"mouse-1: select window, mouse-2: delete others ..."))
(:eval (format-time-string "%F"))
mode-line-process
minor-mode-alist
#("%n" 0 2 (help-echo "mouse-2: widen" local-map (keymap ...)))
")%] "
(-3 . "%P")
;; "-%-"
)))
这里重定义了默认模式行。大部分组件沿用原版,只做了少量修改。我设置的是 默认 模式行格式,以便 Info 等模式可以覆盖它。
列表中的很多元素都一目了然:mode-line-modified 标记缓冲区是否被修改,mode-name 显示当前模式名称等。格式看起来复杂,是因为用到了两个尚未介绍的特性。
模式行的第一个字符串是连字符 ‘-’。早期只需简单写作 "-"。但现在 Emacs 可以为字符串附加属性,比如高亮或本例中的帮助提示。将鼠标移到连字符上就会显示帮助信息(默认需要等待 0.7 秒,可通过修改 tooltip-delay 调整延迟)。
新的字符串格式语法如下:
#("-" 0 1 (help-echo "mouse-1: select window, ..."))
#( 表示列表开始。第一个元素是字符串本身,即单个 ‘-’。第二个和第三个元素指定属性作用的范围。范围从字符 之后 开始,0 表示从第一个字符前开始,1 表示到第一个字符后结束。第三个元素是该范围的属性,由属性名(本例为 ‘help-echo’)和对应值(字符串)组成。这种新格式的第二、三、四个元素可以重复出现。
更多信息请参考 See Text Properties in The GNU Emacs Lisp Reference Manual 以及 Mode Line Format in The GNU Emacs Lisp Reference Manual。
mode-line-buffer-identification
显示当前缓冲区名称。它是一个以 (#("%12b" 0 4 … 开头的列表。
‘"%12b"’ 使用我们熟悉的 buffer-name 函数显示缓冲区名;‘12’ 指定最多显示的字符数。名称不足时会用空格补齐。(缓冲区名通常可以长于 12 个字符,在标准 80 列 框架 中该长度效果很好。)
:eval 表示对后续表达式求值,并将结果作为字符串显示。本例中该表达式会显示完整主机名的第一部分。第一部分以 ‘.’ 结尾,因此我用 string-match 函数获取其长度,从第 0 个字符到该长度的子串即为主机名。
对应表达式:
(:eval (substring
(system-name) 0 (string-match "\\..+" (system-name))))
‘%[’ 和 ‘%]’ 会为每一层递归编辑生成一对方括号。‘%n’ 在启用缩窄时显示 “Narrow”。‘%P’ 显示缓冲区内容在 框架 底部上方的百分比,或显示 “Top”、“Bottom”、“All”。(小写 ‘p’ 显示在 框架 顶部上方的百分比。)‘%-’ 插入足够的连字符填满整行。
记住:你不必接受默认的 Emacs — 你的 Emacs 可以拥有不同的颜色、命令和按键。
另一方面,如果你想启动一个完全未定制的原生 Emacs,输入:
emacs -q
这样启动的 Emacs 不会加载 ~/.emacs 初始化文件,是纯粹的默认配置,无任何额外设置。