emacs 中的诡计宏缩进
guile macro indentation in emacs
是否有类似 (declare (indent defun))
的东西用于诡计,以便用户定义宏的缩进像 define
s 一样工作?
例如,如果我写下面的宏,
(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/ geiser
,geiser-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。
是否有类似 (declare (indent defun))
的东西用于诡计,以便用户定义宏的缩进像 define
s 一样工作?
例如,如果我写下面的宏,
(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/ geiser
,geiser-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。