emacs 中的诡计宏缩进

guile macro indentation in emacs

是否有类似 (declare (indent defun)) 的东西用于诡计,以便用户定义宏的缩进像 defines 一样工作?

例如,如果我写下面的宏,

(define-syntax my-when
  (syntax-rules ()
    ((my-when condition exp ...)
     (if condition
         (begin exp ...)))))

然后,我得到的缩进看起来像,

(my-when #t
         (write "hi"))

但更喜欢以下

(my-when #t
  (write "hi"))

在 elisp 中,我可以通过

获得所需的缩进
(defmacro my-when (condition &rest body)
  (declare (indent defun))
  `(if ,condition
       ,@body))

(my-when t
  (message "hi"))

Version/mode 注释:emacs 26,scheme-mode w/ geisergeiser-impl--implementation = guile

为符号添加缩进提示:

(put 'my-when 'scheme-indent-function 1)

这或多或少是 (declare (indent 1))defmacro 中所做的。


lisp-mode 使用 lisp-indent-line,寻找符号上的 lisp-indent-function 属性。内置的 scheme-mode 使用 lisp-indent-function,所以你会认为它会像 lisp-mode 中那样工作。但是 属性 名称需要与模式名称相匹配。有关 属性 的值,请参阅 https://www.gnu.org/software/emacs/manual/html_node/elisp/Indenting-Macros.html#Indenting-Macros