Ändern der Einrückung einiger Emacs Lisp-Formen

8

Ich möchte, dass einige Emacs Lisp-Formen wie Common Lisp eingerückt werden. Zum Beispiel wird in Emacs Lisp ifwie folgt eingerückt:

(if COND
    THEN
  ELSE)

während ich es so bevorzugen würde:

(if COND
    THEN
    ELSE)

Ich könnte das tun:

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

Dies wirkt sich jedoch auf alle Formen aus und unterbricht somit die Einrückung von Emacs Lisp-Makros wie cl-letfjedem benutzerdefinierten Makro.

Elena
quelle

Antworten:

17

Antworten:

Symbole für Funktionen und Makros haben eine lisp-indent-functionEigenschaft, die Sie mit declareoder in Ihrem Fall festlegen können , da sie ifbereits definiert ist, können Sie sie einfach verwenden put.

Über die möglichen Eigenschaftswerte können Sie hier lesen:

M-: (info "(elisp) Indenting Macros") return

ifDie Standardeinstellung ist, 2was bedeutet, dass die zweite Form eine Sonderbehandlung erhält und versetzt ist.

Sie können den Eigenschaftswert in ändern, 'defunund alle Körperformen werden ausgerichtet.

(put 'if 'lisp-indent-function 'defun)

Beste Übung:

Es ist wichtig zu beachten, dass es einen Grund für den Einrückungsstil gibt. ifin Elisp ist NICHT wie ifin Common Lisp.

Beachten Sie die verschiedenen Signaturen:

Common Lisp: (if TEST THEN &OPTIONAL ELSE)

Emacs Lisp: (if COND THEN ELSE...)

In Emacs lisp können Sie nach der Bedingung so viele Formulare haben, wie Sie möchten, aber nur das erste Formular ist die THEN-Klausel. Alle anderen Formulare sind Teil der ELSE-Klausel.

Dies ist ein gültiges Elisp- ifFormular, das in CL nicht gültig ist:

(if something
    (message "THEN")
  (message "all")
  (message "these")
  (message "run")
  (message "on")
  (message "ELSE"))

Dies zeigt, warum es wichtig ist, dass die THEN-Klausel stärker eingerückt wird, um sie von allen anderen Formen abzuheben.

Zusätzlich zu dem Einzug, der für die Fähigkeit des Benutzers wichtig ist, den Code zu analysieren, würde er auch gegen die akzeptierten Stilmuster von elisp verstoßen. 99,99999% (sorgfältig berechnet) des Elisp-Codes, auf den Sie stoßen, verwenden genau das gleiche Standard-Einrückungsschema. Wenn Sie die Einrückung iffür Ihren eigenen Gebrauch ändern, wird es für Sie schwierig, an anderen Elisp zu arbeiten, und für andere wird es schwierig, an Ihrem zu arbeiten.

Jordon Biondo
quelle
2

Ich verwende tatsächlich den Common Lisp-Einzug, mit dem Elisp-Einzug für if. Sie können einen Code ähnlich meinem anpassen:

(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)))
abo-abo
quelle
Vielen Dank, aber dafür müsste ich auch den Einzug aller benutzerdefinierten Makros korrigieren. Ich würde lieber den entgegengesetzten Weg gehen und nur die Einrückung von ifwie von korrigieren lisp-indent-function.
Elena
Ich habe diese Konfiguration seit Jahren. Es gibt keine anderen Makros, die ich "reparieren" musste. Denken Sie daran, declarein jedes neue Makro eine Anweisung einzufügen, was auf jeden Fall gut ist.
Abo-Abo