16.14 修改后的模式行

最后,有一个我真的很喜欢的功能:修改后的模式行。

当我通过网络工作时,我会忘记我使用的是哪台机器。而且,我往往会迷失在当前位置、光标所在行等信息中。

因此,我将我的模式行重置为以下样式:

-:-- foo.texi   rattlesnake:/home/bob/  行 1  (Texinfo 填充) 顶部

我正在访问一个名为foo.texi的文件,位于我的机器rattlesnake上,位于/home/bob缓冲区。我在第1行,在Texinfo模式下,并且位于缓冲区的顶部。

我的.emacs文件有一个如下的部分:

;; 设置一个模式行,告诉我所在的机器、目录和所在的行,以及其他通常的信息。
(setq-default mode-line-format
 (quote
  (#("-" 0 1
     (help-echo
      "mouse-1: 选择窗口, mouse-2: 删除其他..."))
   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: 选择窗口, mouse-2: 删除其他..."))
   (line-number-mode " 行 %l ")
   global-mode-string
   #("   %[(" 0 6
     (help-echo
      "mouse-1: 选择窗口, mouse-2: 删除其他..."))
   (:eval (format-time-string "%F"))
   mode-line-process
   minor-mode-alist
   #("%n" 0 2 (help-echo "mouse-2: 扩大" local-map (keymap ...)))
   ")%] "
   (-3 . "%P")
   ;;   "-%-"
   )))

在这里,我重新定义了默认的模式行。列表中的大多数部分来自原始模式行;但我做了一些更改。我设置了默认的模式行格式,以允许各种模式(如Info)覆盖它。

列表中的许多元素都是不言自明的: mode-line-modified是一个变量,表示缓冲区是否被修改,mode-name表示模式的名称等等。但是,格式看起来很复杂,是因为我们还没有讨论的两个特性。

模式行中的第一个字符串是一个破折号,‘-’。在过去,它将简单地指定为"-"。但现在,Emacs可以为字符串添加属性,如高亮或者在本例中,一个帮助功能。如果将鼠标光标放在连字符上,将显示一些帮助信息(默认情况下,您必须等待七分之一秒才能看到信息。您可以通过更改tooltip-delay的值来更改该时间。)

新字符串格式具有特殊的语法:

#("-" 0 1 (help-echo "mouse-1: 选择窗口, ..."))

#(开始一个列表。列表的第一个元素是字符串本身,只有一个‘-’。第二个和第三个元素指定第四个元素适用的范围。范围从字符之后开始,所以零表示范围从第一个字符之前开始;1表示范围在第一个字符之后结束。第三个元素是范围的属性。它包含一个属性列表,一个属性名称,在本例中是‘help-echo’,后跟一个值,在本例中是一个字符串。新字符串格式的第二、第三和第四个元素可以重复。

See 文本属性 in GNU Emacs Lisp参考手册, 并参见模式行格式 in GNU Emacs Lisp参考手册,获取更多信息。

mode-line-buffer-identification 显示当前缓冲区的名称。它是一个以(#("%12b" 0 4 …开头的列表。 #(开始列表。

"%12b"’显示当前缓冲区的名称,使用我们熟悉的buffer-name函数;‘12’指定将显示的最大字符数。当名称字符较少时,将添加空格以填充到这个数字。 (缓冲区名称可以并且通常应该比12个字符长;在典型的80列宽窗口中,此长度效果很好。)

:eval表示评估以下表达式,并将结果用作要显示的字符串。在这种情况下,该表达式显示完整系统名称的第一个组成部分。第一个组成部分的末尾是‘.’(句点),因此我使用string-match函数告诉我第一个组成部分的长度。从第零个字符到该长度的子字符串是机器的名称。

这是表达式:

(:eval (substring
        (system-name) 0 (string-match "\\..+" (system-name))))

%[’和‘%]’使每个递归编辑级别都出现一对方括号。 ‘%n’在缩小效果生效时说“Narrow”。“%P”告诉您在窗口底部之上的缓冲区百分比,或者是“Top”、“Bottom”或“All”(小写的‘p’告诉您在窗口顶部之上的百分比)。 ‘%-’插入足够的破折号以填满整行。

记住,你不一定非要喜欢Emacs才能使用它—你自己的Emacs可以有不同的颜色、不同的命令和不同的键盘快捷键,与默认的Emacs不同。

另一方面,如果您想要启动一个纯粹的开箱即用的Emacs,没有定制,请键入:

emacs -q

这将启动一个不加载您的~/.emacs初始化文件的Emacs。一个纯粹的、默认的Emacs。没有更多。