Risposta:
I simboli per funzioni e macro hanno una lisp-indent-function
proprietà che puoi impostare con declare
o nel tuo caso, poiché if
è già definito, puoi semplicemente usare put
.
Puoi leggere i possibili valori delle proprietà qui:
M-: (info "(elisp) Indenting Macros")
return
if
L'impostazione predefinita è 2
che significa che la seconda forma ottiene il trattamento speciale ed è compensata.
È possibile modificare il valore della proprietà in 'defun
e tutti i moduli del corpo verranno allineati.
(put 'if 'lisp-indent-function 'defun)
La migliore pratica:
È importante notare che esiste una ragione per lo stile di rientro. if
in Elisp NON è come if
in Common Lisp.
Nota le diverse firme:
Lisp comune: (if TEST THEN &OPTIONAL ELSE)
Emacs Lisp: (if COND THEN ELSE...)
In Emacs lisp, dopo la condizione puoi avere tutte le forme che vuoi, ma solo la prima forma è la clausola THEN, tutte le altre forme fanno parte della clausola ELSE.
Questo è un if
modulo Elisp valido che non è valido in CL:
(if something
(message "THEN")
(message "all")
(message "these")
(message "run")
(message "on")
(message "ELSE"))
Questo dimostra perché è importante che la clausola THEN sia più rientrata, è per farla risaltare contro tutte le forme ELSE.
Oltre al fatto che il rientro è importante per la capacità degli utenti di analizzare il codice, andrebbe anche contro i modelli di stile accettati di elisp. Il 99,99999% (calcolato con precisione) del codice elisp che incontrerai utilizzerà lo stesso schema di rientro predefinito. Cambiare il rientro if
per uso personale ti renderà difficile lavorare su altri popoli elisir e rendere difficile per gli altri lavorare sul tuo.
if
come eseguito dalisp-indent-function
.