在过去的几章中,我们介绍了一个宏和相当多的函数和特殊形式。这里对它们进行简要描述,以及一些尚未提到的类似函数。
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"))
<><=>=<函数测试其第一个参数是否小于第二个参数。相应的函数>测试第一个参数是否大于第二个参数。类似地,<=测试第一个参数是否小于或等于第二个参数,而>=测试第一个参数是否大于或等于第二个参数。在所有情况下,两个参数必须是数字或标记(标记表示缓冲区中的位置)。
==函数测试两个参数是否相等,这两个参数都必须是数字或标记。
equaleq测试两个对象是否相同。equal使用“相同”一词的一种含义,而eq使用另一种含义:如果两个对象具有相似的结构和内容,例如同一本书的两个副本,则equal返回真。另一方面,eq返回真,如果两个参数实际上是同一个对象。
string<string-lesspstring=string-equalstring-lessp函数测试其第一个参数是否小于第二个参数。同样功能的较短名称(defalias)是string<。
string-lessp的参数必须是字符串或符号;排序是词法的,因此大小写是敏感的。使用符号的打印名称而不是符号本身。
空字符串,即‘""’,即不包含字符的字符串,小于任何包含字符的字符串。
string-equal提供相应的相等测试。它的较短名称是string=。没有与>,>=或<=相对应的字符串测试函数。
message在回显区域打印消息。第一个参数是一个字符串,可以包含‘%s’,‘%d’或‘%c’,用于打印紧随其后的参数的值。由‘%s’使用的参数必须是字符串或符号;由‘%d’使用的参数必须是数字。由‘%c’使用的参数必须是ASCII代码数字;它将被打印为具有该ASCII代码的字符。 (其他各种未提到的%-序列未在此提及。)
setqsetsetq特殊形式将其第一个参数的值设置为第二个参数的值。第一个参数由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的最大允许值。除非限制了缩小,否则为缓冲区的末尾。