在宏定义中,你可以使用 declare 形式(see 定义宏)来指定按下 TAB 时,该宏的调用该如何缩进。缩进说明的写法如下:
(declare (indent indent-spec))
这样做会在宏名上设置 lisp-indent-function 属性。
indent-spec 可以取以下几种值:
nil此值等同于未设置该属性 — 使用标准缩进格式。
defun将该宏当作 ‘def’ 类结构处理:把第二行视为体部(body) 的起始位置。
宏的前 number 个参数为 特殊(distinguished) 参数;其余参数被视作表达式的体部。表达式内某行的缩进方式,取决于该行第一个参数是否为特殊参数:
若该参数属于体部,该行缩进比包含此表达式的左括号多 lisp-body-indent 列;
若该参数是特殊参数,且为第一个或第二个参数,则该行缩进比左括号多 两倍 的 lisp-body-indent 列;
若该参数是特殊参数,但非第一个 / 第二个参数,则使用标准缩进格式。
symbol 需为一个函数名;缩进时会调用该函数计算表达式内对应行的缩进值。 该函数接收两个参数:
待缩进行的起始位置。
parse-partial-sexp(用于计算缩进和嵌套层级的 Lisp 原语函数)解析至该行起始位置时返回的值。
该函数应当返回以下两种结果之一: 一个数字,表示当前行的缩进列数; 或者一个列表,其 car 部分为上述数字。 返回数字与返回列表的区别在于:返回数字表示同一嵌套层级下后续所有行都应按此行的方式缩进;返回列表则表示后续行可能需要不同的缩进。 这在由 C-M-q 计算缩进时会产生影响:如果返回值是数字,C-M-q 在到达列表末尾之前,无需重新计算后续行的缩进。