Sangría de las constantes de la lista


7

La sangría de Emacs del código Emacs lisp es realmente genial, excepto por una cosa:

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

¿Es esta realmente la forma preferida de sangrar este bloque? Opuesto a

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

Me resulta especialmente confuso en comparación con el valor predeterminado para las listas:

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

¿Hay alguna razón para este comportamiento? Posiblemente podría entenderlo para las listas entrecomilladas, ya que produciría una mejor sangría para las macros, pero ¿qué pasa con las listas?


La sección de convenciones de codificación del manual es bastante explícita al respecto, por cierto:Indent the file using the default indentation parameters.
Clément

3
Las convenciones de codificación podrían decir que por convención respetamos la sangría predeterminada, pero eso no proporciona una razón por la cual la sangría predeterminada es lo que es. No hay nada en las convenciones de codificación que diga por qué una lista constante está sangrada como está. (Esto es similar a la respuesta de un padre cansado, en respuesta a la 99a "¿Por qué?", ​​" Solo porque ".)
Drew

44
@EmacsUser: Por supuesto. ¿Cual es tu punto? La pregunta que se hizo fue " ¿Hay alguna razón para este comportamiento? " ¿Por qué esta convención de sangría? Las convenciones no se caen del cielo. Y a veces se cambian. Si la única respuesta dada a ¿Por qué? es " Esa es la convención ", esa no es una respuesta en absoluto.
Dibujó el

3
@EmacsUser: Nadie ha discutido en contra de su "punto". La pregunta es buena. Puede haber buenas razones para haber elegido este valor predeterminado. O no. Puede haber razones para una sangría alternativa. No hay nada malo en hacer la pregunta.
Dibujó el

3
@ Clément: FWIW, personalmente creo que esto es un error y ha habido cambios en esta parte del modo Elisp "recientemente", por lo que es posible que desee M-x report-emacs-bug.
Stefan

Respuestas:


2

Aquí están las configuraciones que estoy usando para arreglar la sangría:

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

Traté de arreglar la sangría de Elisp en un momento, pero fue demasiado complicado y me di por vencido. Pero la configuración anterior ha funcionado bien durante años.


¿Puede explicar brevemente qué hacen esos puty getformularios? ¿Reemplaza las cl-fletinstancias de la función con flete cl-labelsinstancias labelssolo en el common-lisp-indent-function? Si es así, ¿por qué se hace eso? Además, ¿qué hace el tercer puesto? Leí la putdocumentación pero aún no tenía sentido. Se traduciría a "establecer el valor de la common-lisp-indent-functionpropiedad del ifsímbolo en 2", pero eso no tenía sentido para mí.
Kaushal Modi

En estos 3 casos, 'lisp-indent-function(es decir, el predeterminado) es realmente mejor que 'common-lisp-indent-function. Esos ajustes hacen que la sangría se transfiera de uno a otro.
abo-abo

1
Nota: Es sólo la primera línea que responde a esta pregunta - es decir, (setq lisp-indent-function 'common-lisp-indent-function). El resto no tiene nada que ver con la sangría que se usará para una lista constante.
Drew
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.