如何在 window caption 和 mode line 上显示有用信息

frame-title-format 变量可以控制窗口名称,叫做 title 也好,caption 也好。 mode-line-foramt 控制显示 mode line 上显示的信息。因为他们总在你的视线之内,所 以用他们来显示有用信息是很方便的。这两个变量的用法十分相似。

例如,在 mode line 显示时间,=M-x display-time-mode= 这个命令就是通过修改 mode-line-format 实现功能的。

默认的情况下, mode line 上可以显示文件是否改动过,是否是只读的,采用什么样的 编码。 当前 buffer 的名称。 minor mode , major mode 。 还可以显示当前是第几行。 有些功能是可以调用高层命令修改=mode-line-format 来实现的,例如=display-time-mode= 等等。 这里只讨论底层实现。他几乎可以实现任何功能。

mode-line-format 是一个 list ,其中的每一个元素可以使不同的类型,更具不同类型, 会做出不同的处理。下面讨论不同类型的处理方式。

string

这种类型是最简单的类型. 例如 :

(setq x mode-line-format)
(setq mode-line-format (cons "%*abc" mode-line-format))
(setq mode-line-format x)

可以在显示 abc 在 mode line 的开头。注意保存和恢 复 mode-line-format。

string 中如果出现 % ,那么就作为特殊处理。就类 似 c 语言中的 printf . 或者 BASH 中的环境变量一 样。

%b
buffer 名称
%c
行号
%f
buffer 访问的文件名称
%F
窗口名称
%l
列号
%p
表示当前显示的部分的是文件那一部分,用百分 比表示。
%s
当前 buffer 对应的外部程序的状态,在编译程 序的时候有用。
%%
打印 % .

还有其他的一些东西,不太常用,或者默认情况下已经使用了。

SYMBOL

如果是 symbol 的话,就得到 symbol 的 value ,然后处理这个 value 。

说来简单,其实很强大的功能。 symbol 的 value 可以是和 mode-line-format 一样的 东西。例如 , mode-line-format 中包含 global-mode-string 这样的一个 symbol ,那么 就可以修改=global-mode-string=的 value 来控制 mode line 中间部分的显示。 global-mode-string 的修改规则和=mode-line-format= 一样。 这样就可以实现递归机制实 现了十分强大的扩展性。后面还有类似的机制。

注意,如果 sybmol 的 value 是一个 string ,那么% 的特殊功能就没有了。

LIST

根据 list 中的第一个元素的类型分为以下几种情况

第一个元素是一个 string 或者是一个 list
按照现在描述的规则递归处理整个 list 中的所有元素。
第一个元素是 :eval
那么对后面的 FORM 求值,这种扩展功能可以实现 一切功能 。 例如,
;;
;; 我经常用不同的用户名称,在不同的主机上运行
;; emacs , 下面的代码可以在frame title 上
;; 区分不同的主机和用户名称。
(setq frame-title-format '((:eval (getenv-internal "LOGNAME")) ;;显示登陆名称
                           "@"
                           (:eval (system-name));;显示主机名称
                           ":"
                           (:eval (or (buffer-file-name) (buffer-name)))
                           ))

还有两种模式,`(SYMBOL THEN ELSE)' , (WIDTH REST...) ,我不常用,就不说了。