Modifica del rientro di alcune forme di Emacs Lisp


8

Vorrei che alcune forme di Emacs Lisp fossero rientrate come Common Lisp. Ad esempio, in Emacs Lisp, ifè rientrato in questo modo:

(if COND
    THEN
  ELSE)

mentre lo preferirei così:

(if COND
    THEN
    ELSE)

Potrei farlo:

(setq lisp-indent-function #'common-lisp-indent-function)

Ma questo ha un impatto su tutte le forme, interrompendo così il rientro delle macro di Emacs Lisp, come cl-letfe qualsiasi macro definita dall'utente.

Risposte:


17

Risposta:

I simboli per funzioni e macro hanno una lisp-indent-functionproprietà che puoi impostare con declareo 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

ifL'impostazione predefinita è 2che significa che la seconda forma ottiene il trattamento speciale ed è compensata.

È possibile modificare il valore della proprietà in 'defune 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. ifin Elisp NON è come ifin 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 ifmodulo 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 ifper uso personale ti renderà difficile lavorare su altri popoli elisir e rendere difficile per gli altri lavorare sul tuo.


2

In realtà uso il rientro Common Lisp, con il rientro Elisp per if. Puoi personalizzare un codice simile al mio:

(setq lisp-indent-function 'common-lisp-indent-function)
(eval-after-load 'cl-indent
  `(progn
     (put 'cl-flet 'common-lisp-indent-function
          (get 'flet 'common-lisp-indent-function))
     (put 'cl-labels 'common-lisp-indent-function
          (get 'labels 'common-lisp-indent-function))
     (put 'if 'common-lisp-indent-function 2)))

Grazie, ma ciò richiederebbe di correggere anche il rientro di tutte le macro definite dall'utente. Preferirei seguire la strada opposta e correggere solo il rientro di ifcome eseguito da lisp-indent-function.
Elena,

Ho avuto questa configurazione per anni. Ci sono zero altre macro che dovevo "riparare". Ricorda solo di mettere una declaredichiarazione in ogni nuova macro, che è comunque buona da fare.
abo-ABO
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.