Czy jest coś takiego (declare (indent defun))
dla podstępu, więc wcięcia makr zdefiniowanych przez użytkownika działają podobnie define
s?
Na przykład, jeśli napiszę następujące makro,
(define-syntax my-when
(syntax-rules ()
((my-when condition exp ...)
(if condition
(begin exp ...)))))
Wtedy dostaję wcięcia, które wyglądają jak
(my-when #t
(write "hi"))
Ale wolałbym, co następuje
(my-when #t
(write "hi"))
W elisp mogłem uzyskać żądane wcięcie
(defmacro my-when (condition &rest body)
(declare (indent defun))
`(if ,condition
,@body))
(my-when t
(message "hi"))
Uwagi do wersji / trybu: emacs 26, scheme-mode
w / geiser
, geiser-impl--implementation
= guile
Odpowiedzi:
3 dla odpowiedzi № 1Dodaj wskazówkę do wcięcia dla symbolu:
(put "my-when "scheme-indent-function 1)
To jest mniej więcej co (declare (indent 1))
wchodzi w defmacro
.
lisp-mode
używa lisp-indent-line
, który szuka lisp-indent-function
właściwość na symbolu. Wbudowany scheme-mode
używa lisp-indent-function
, więc pomyślałbyś, że to działa tak jak w lisp-mode
. Jednak nazwa właściwości musi być zgodna z nazwą trybu. Widzieć https://www.gnu.org/software/emacs/manual/html_node/elisp/Indenting-Macros.html#Indenting-Macros dla wartości nieruchomości.