emacs中的guile宏缩进

时间:2017-05-14 02:32:37

标签: emacs macros scheme indentation guile

对于guile是否有类似(declare (indent defun))的内容,因此用户定义的宏缩进就像define一样?

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

(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"))

版本/模式备注:emacs 26,scheme-mode w / geisergeiser-impl--implementation = guile

1 个答案:

答案 0 :(得分:3)

为符号添加缩进提示:

(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