3.11 复习

在过去的几章中,我们介绍了一个宏和相当多的函数和特殊形式。这里对它们进行简要描述,以及一些尚未提到的类似函数。

eval-last-sexp

评估光标前的最后一个符号表达式。除非在调用该函数时使用参数,否则该值将打印在回显区域;在这种情况下,输出将打印在当前缓冲区中。通常,此命令绑定到 C-x C-e

defun

定义函数。此宏最多有五个部分:名称、传递给函数的参数的模板、文档、可选的交互声明和定义的主体。

例如,在Emacs中,dired-unmark-all-marks 的函数定义如下。

(defun dired-unmark-all-marks ()
  "从Dired缓冲区中的所有文件中删除所有标记。"
  (interactive)
  (dired-unmark-all-files ?\r))
interactive

声明函数可交互使用。此特殊形式后面可能跟着一个包含一个或多个部分的字符串,将信息传递给函数的参数,按顺序。这些部分还可以告诉解释器提示信息。字符串的各部分由新行,即 ‘\n’ 分隔。

常见的代码字符包括:

b

现有缓冲区的名称。

f

现有文件的名称。

p

数值前缀参数。(注意,此处的 p 是小写。)

r

光标和标记,作为两个数值参数,从最小到最大。这是唯一指定两个连续参数而不是一个参数的代码字母。

See 用于 ‘interactive’ 的代码字符 in GNU Emacs Lisp参考手册, 以获取完整的代码字符列表。

let

声明一个变量列表,用于在let体内使用,并给它们一个初始值,可以是nil或指定的值;然后评估let体内的其余表达式,并返回最后一个表达式的值。在let体内,Lisp解释器看不到与外部绑定的同名变量的值。

例如,

(let ((foo (buffer-name))
      (bar (buffer-size)))
  (message
   "当前缓冲区是 %s,包含 %d 个字符。"
   foo bar))
save-excursion

在评估此特殊形式的体之前,记录point和当前缓冲区的值。在评估完体后,恢复point和缓冲区的值。

例如,

(message "我们已经在这个缓冲区中 %d 个字符。"
         (- (point)
            (save-excursion
              (goto-char (point-min)) (point))))
if

评估函数的第一个参数;如果为真,则评估第二个参数;否则,如果存在第三个参数,则评估第三个参数。

if特殊形式被称为条件语句。Emacs Lisp中还有其他条件语句,但if可能是最常用的。

例如,

(if (= 22 emacs-major-version)
    (message "这是22版的Emacs")
  (message "这不是22版的Emacs"))
<
>
<=
>=

<函数测试其第一个参数是否小于第二个参数。相应的函数>测试第一个参数是否大于第二个参数。类似地,<=测试第一个参数是否小于或等于第二个参数,而>=测试第一个参数是否大于或等于第二个参数。在所有情况下,两个参数必须是数字或标记(标记表示缓冲区中的位置)。

=

=函数测试两个参数是否相等,这两个参数都必须是数字或标记。

equal
eq

测试两个对象是否相同。equal使用“相同”一词的一种含义,而eq使用另一种含义:如果两个对象具有相似的结构和内容,例如同一本书的两个副本,则equal返回真。另一方面,eq返回真,如果两个参数实际上是同一个对象。

string<
string-lessp
string=
string-equal

string-lessp函数测试其第一个参数是否小于第二个参数。同样功能的较短名称(defalias)是string<

string-lessp的参数必须是字符串或符号;排序是词法的,因此大小写是敏感的。使用符号的打印名称而不是符号本身。

空字符串,即‘""’,即不包含字符的字符串,小于任何包含字符的字符串。

string-equal提供相应的相等测试。它的较短名称是string=。没有与>>=<=相对应的字符串测试函数。

message

在回显区域打印消息。第一个参数是一个字符串,可以包含‘%s’,‘%d’或‘%c’,用于打印紧随其后的参数的值。由‘%s’使用的参数必须是字符串或符号;由‘%d’使用的参数必须是数字。由‘%c’使用的参数必须是ASCII代码数字;它将被打印为具有该ASCII代码的字符。 (其他各种未提到的%-序列未在此提及。)

setq
set

setq特殊形式将其第一个参数的值设置为第二个参数的值。第一个参数由setq自动引用。它对后续的参数对执行相同的操作。另一个函数set只接受两个参数,并在设置其第一个参数返回的值之前评估两个参数。

buffer-name

没有参数时,返回缓冲区的名称,作为字符串。

buffer-file-name

没有参数时,返回缓冲区正在访问的文件的名称。

current-buffer

返回Emacs处于活动状态的缓冲区;它可能不是屏幕上可见的缓冲区。

other-buffer

返回最近选择的缓冲区(不包括作为参数传递给other-buffer的缓冲区和当前缓冲区)。

switch-to-buffer

选择Emacs处于活动状态并在当前窗口中显示的缓冲区,以便用户可以查看它。通常绑定到C-x b

set-buffer

切换Emacs的注意力到将运行程序的缓冲区。不更改窗口显示的内容。

buffer-size

返回当前缓冲区中字符的数量。

point

返回光标当前位置的值,作为从缓冲区开头计算的整数字符数。

point-min

返回当前缓冲区中point的最小允许值。除非限制了缩小,否则为1。

point-max

返回当前缓冲区中point的最大允许值。除非限制了缩小,否则为缓冲区的末尾。