3.11 Review

在前面几章中,我们介绍了一个宏、相当多的函数和特殊形式。 这里对它们做简要说明,并补充几个尚未提到的同类函数。

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,标记表示缓冲区中的位置)。

=

= 函数判断两个同为数字或标记的参数是否相等。

equal
eq

判断两个对象是否相同。equaleq 对“相同(same)”的定义不同: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 自动引用。 它也可以对后续多对参数执行同样操作。

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

返回当前缓冲区中光标的最大合法值。 若未启用缩进限制,该值为缓冲区末尾。