14.6 宏的缩进

在宏定义中,你可以使用 declare 形式(see 定义宏)来指定按下 TAB 时,该宏的调用该如何缩进。缩进说明的写法如下:

(declare (indent indent-spec))

这样做会在宏名上设置 lisp-indent-function 属性。

indent-spec 可以取以下几种值:

nil

此值等同于未设置该属性 — 使用标准缩进格式。

defun

将该宏当作 ‘def’ 类结构处理:把第二行视为体部(body) 的起始位置。

an integer, number

宏的前 number 个参数为 特殊(distinguished) 参数;其余参数被视作表达式的体部。表达式内某行的缩进方式,取决于该行第一个参数是否为特殊参数: 若该参数属于体部,该行缩进比包含此表达式的左括号多 lisp-body-indent 列; 若该参数是特殊参数,且为第一个或第二个参数,则该行缩进比左括号多 两倍lisp-body-indent 列; 若该参数是特殊参数,但非第一个 / 第二个参数,则使用标准缩进格式。

a symbol, symbol

symbol 需为一个函数名;缩进时会调用该函数计算表达式内对应行的缩进值。 该函数接收两个参数:

pos

待缩进行的起始位置。

state

parse-partial-sexp(用于计算缩进和嵌套层级的 Lisp 原语函数)解析至该行起始位置时返回的值。

该函数应当返回以下两种结果之一: 一个数字,表示当前行的缩进列数; 或者一个列表,其 car 部分为上述数字。 返回数字与返回列表的区别在于:返回数字表示同一嵌套层级下后续所有行都应按此行的方式缩进;返回列表则表示后续行可能需要不同的缩进。 这在由 C-M-q 计算缩进时会产生影响:如果返回值是数字,C-M-q 在到达列表末尾之前,无需重新计算后续行的缩进。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike