在前面几章中,我们介绍了一个宏、相当多的函数和特殊形式。 这里对它们做简要说明,并补充几个尚未提到的同类函数。
eval-last-sexp对光标当前位置前的最后一个符号表达式求值。 除非该函数带参数调用,否则值会打印在回显区; 带参数时输出会打印在当前缓冲区。该命令通常绑定到 C-x C-e。
defun定义函数。该宏最多包含五部分:函数名、 传递给函数的参数模板、文档字符串、可选的交互式声明,以及定义体。
例如,Emacs 中 dired-unmark-all-marks 的函数定义如下。
(defun dired-unmark-all-marks () "Remove all marks from all files in the Dired buffer." (interactive) (dired-unmark-all-files ?\r))
interactive向解释器声明该函数可交互式使用。 该特殊形式后可接一个包含一个或多个片段的字符串, 按顺序向函数参数传递信息。这些片段也可以告知解释器提示用户输入信息。 字符串中的片段使用换行符 ‘\n’ 分隔。
常用代码字符如下:
b现有缓冲区的名称。
f现有文件的名称。
p数字前缀参数。(注意这里的 p 是小写。)
r光标和标记,以两个数字参数形式返回,较小值在前。 这是唯一一个指定连续两个参数而非一个参数的代码字母。
See Code Characters for ‘interactive’ in The GNU Emacs Lisp Reference Manual,可查看完整代码字符列表。
let声明一组变量在 let 体内使用,
并为其赋予初始值(nil 或指定值);
然后对 let 体内其余表达式求值,并返回最后一个表达式的值。
在 let 内部,Lisp 解释器不会访问 let 外部
同名变量的绑定值。
例如:
(let ((foo (buffer-name))
(bar (buffer-size)))
(message
"This buffer is %s and has %d characters."
foo bar))
save-excursion在对该特殊形式的体求值前,记录光标和当前缓冲区的值, 之后恢复光标与缓冲区。
例如:
(message "We are %d characters into this buffer."
(- (point)
(save-excursion
(goto-char (point-min)) (point))))
if对函数的第一个参数求值;若为真则对第二个参数求值; 否则对第三个参数求值(如果存在)。
if 特殊形式被称为条件表达式(conditional)。
Emacs Lisp 中还有其他条件表达式,但 if 可能是最常用的。
例如:
(if (= 22 emacs-major-version)
(message "This is version 22 Emacs")
(message "This is not version 22 Emacs"))
<><=>=< 函数判断第一个参数是否小于第二个参数。
对应的 > 判断第一个参数是否大于第二个。
同理,<= 判断是否小于等于,>= 判断是否大于等于。
在所有情况下,两个参数都必须是数字或标记(marker,标记表示缓冲区中的位置)。
== 函数判断两个同为数字或标记的参数是否相等。
equaleq判断两个对象是否相同。equal 和 eq
对“相同(same)”的定义不同: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 自动引用。
它也可以对后续多对参数执行同样操作。
buffer-name无参数时,以字符串形式返回当前缓冲区名称。
buffer-file-name无参数时,返回当前缓冲区访问的文件名称。
current-buffer返回 Emacs 当前活动的缓冲区;它不一定是屏幕上可见的缓冲区。
other-buffer返回最近一次选中的缓冲区(排除作为参数传入的缓冲区和当前缓冲区)。
switch-to-buffer选中一个缓冲区作为 Emacs 活动缓冲区,并在当前窗口显示,供用户查看。 通常绑定到 C-x b。
set-buffer将 Emacs 的操作目标切换到指定缓冲区,但不改变窗口显示内容。
buffer-size返回当前缓冲区中的字符总数。
point以整数形式返回光标当前位置,从缓冲区开头算起计数字符。
point-min返回当前缓冲区中光标的最小合法值。 若未启用缩进限制(narrowing),该值为 1。
point-max返回当前缓冲区中光标的最大合法值。 若未启用缩进限制,该值为缓冲区末尾。