2017-05-14 21 views
3

對於guile,是否有像(declare (indent defun))之類的東西,用戶定義的宏的縮進工作就像define s?emacs中的guile宏縮進

例如,如果我寫了下面的宏,

(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,我可以通過

012得到想要的縮進
(defmacro my-when (condition &rest body) 
    (declare (indent defun)) 
    `(if ,condition 
     ,@body)) 

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

版本/模式的注意事項:emacs的26scheme-mode瓦特/ geisergeiser-impl--implementation = guile

回答

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瞭解該屬性的值。