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 ,其中的每一个元素可以使不同的类型,更具不同类型, 会做出不同的处理。下面讨论不同类型的处理方式。
这种类型是最简单的类型. 例如 :
(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 中的环境变量一 样。
还有其他的一些东西,不太常用,或者默认情况下已经使用了。
如果是 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 中的第一个元素的类型分为以下几种情况
:eval;; ;; 我经常用不同的用户名称,在不同的主机上运行 ;; 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...) ,我不常用,就不说了。