Einrückung von Listenkonstanten

7

Emacs Einrückung von Emacs Lisp-Code ist wirklich großartig, abgesehen von einer Sache:

(defconst one-to-ten '(one two three
                           four five six seven
                           eight nine ten))

Ist dies tatsächlich die bevorzugte Methode, um diesen Block einzurücken? Im Gegensatz zu

(defconst one-to-ten '(one two three
                       four five six seven
                       eight nine ten))

Ich finde es besonders verwirrend im Vergleich zum Standard für Alisten:

(defconst one-to-ten '((one . 1) (two . 2) (three . 3)
                       (four . 4) (five . 5) (six . 6) (seven . 7)
                       (eight . 8) (nine . 9) (ten . 10)))

Gibt es einen Grund für dieses Verhalten? Ich könnte es möglicherweise für rückseitig zitierte Listen verstehen, da es für Makros eine bessere Einrückung ergeben würde, aber was ist mit Listen?

Clément
quelle
Der Abschnitt über die Codierungskonventionen des Handbuchs ist ziemlich explizit, übrigens:Indent the file using the default indentation parameters.
Clément
3
Die Codierungskonventionen könnten sagen, dass wir gemäß Konvention die Standardeinrückung respektieren, aber dies liefert keinen Grund, warum die Standardeinrückung so ist, wie sie ist. In den Codierungskonventionen gibt es nichts, was besagt, warum eine konstante Liste so eingerückt ist, wie sie ist. (Dies ist vergleichbar mit einem übermüdeten Elternteil, der als Antwort auf das 99. "Warum?", " Nur weil " antwortet .)
Drew
4
@ EmacsUser: Natürlich. Worauf willst du hinaus? Die Frage lautete: " Gibt es einen Grund für dieses Verhalten? " Warum diese Einrückungskonvention? Konventionen fallen nicht vom Himmel. Und manchmal werden sie geändert. Wenn die einzige Antwort auf Warum gegeben? ist " Das ist die Konvention ", das ist überhaupt keine Antwort.
Drew
3
@EmacsUser: Niemand hat gegen Ihren "Punkt" argumentiert. Die Frage ist gut. Es kann gute Gründe geben, diese Standardeinstellung gewählt zu haben. Oder nicht. Es kann Gründe für eine alternative Einrückung geben. Es ist nichts Falsches daran, die Frage zu stellen.
Drew
3
@ Clément: FWIW, ich persönlich denke, dass dies ein Fehler ist und dass es "vor kurzem" Änderungen in diesem Teil des Elisp-Modus gegeben hat, also möchten Sie vielleicht M-x report-emacs-bug.
Stefan

Antworten:

2

Hier sind die Einstellungen, mit denen ich die Einrückung korrigiere:

(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)))

Ich habe versucht, die Elisp-Einkerbung an einer Stelle zu reparieren, aber sie war zu kompliziert und ich habe aufgegeben. Aber die obigen Einstellungen haben jahrelang gut funktioniert.

abo-abo
quelle
Können Sie bitte kurz erklären, was diese putund getFormulare tun? Ersetzt es die cl-fletFunktionsinstanzen durch fletund cl-labelsInstanzen mit labelsnur in der common-lisp-indent-function? Wenn ja, warum wird das gemacht? Auch was macht der dritte Put? Ich habe die putDokumentation gelesen , aber immer noch keinen Sinn ergeben. Es würde bedeuten, "den Wert der common-lisp-indent-functionEigenschaft des ifSymbols auf 2 zu setzen", aber das ergab für mich keinen Sinn.
Kaushal Modi
In diesen 3 Fällen 'lisp-indent-function(dh dem Standard) ist tatsächlich besser als 'common-lisp-indent-function. Durch diese Einstellungen wird der Einzug von einem zum anderen übertragen.
Abo-Abo
1
Hinweis: Es ist nur die erste Zeile, die diese Frage beantwortet - dh (setq lisp-indent-function 'common-lisp-indent-function). Der Rest hat nichts mit dem Einzug zu tun, der für eine konstante Liste verwendet werden soll.
Drew