Recuo das constantes da lista


7

A indentação do código Emacs lisp pelo Emacs é realmente ótima, exceto por uma coisa:

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

Essa é realmente a maneira preferida de recuar esse bloco? Ao contrário de

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

Acho especialmente confuso quando comparado ao padrão para 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)))

Existe uma razão para esse comportamento? Eu poderia entender isso para listas com aspas anteriores, pois produziria melhor recuo para macros, mas e as listas?


A seção de convenções de codificação do manual é bastante explícita sobre isso:Indent the file using the default indentation parameters.
Clément

3
As convenções de codificação podem dizer que, por convenção, respeitamos o recuo padrão, mas isso não fornece uma razão pela qual o recuo padrão é o que é. Não há nada nas convenções de codificação que diga por que uma lista constante é recuada como está. (Isto é semelhante a um pai cansado de responder, em resposta ao 99 " "Por quê?" Só porque ".)
de Drew

4
@EmacsUser: Claro. Onde você quer chegar? A pergunta foi: " Existe uma razão para esse comportamento? " Por que essa convenção de indentação? As convenções não caem do céu. E às vezes eles são mudados. Se a única resposta dada a Por quê? é " Essa é a convenção ", isso não é resposta.
Tirou

3
@EmacsUser: ninguém argumentou contra o seu "argumento". A pergunta é boa. Pode haver boas razões para ter escolhido esse padrão. Ou não. Pode haver razões para um recuo alternativo. Nada de errado em fazer a pergunta.
Drew

3
@ Clément: FWIW, eu pessoalmente acho que isso é um bug e houve mudanças nessa parte do modo Elisp "recentemente", então você pode gostar M-x report-emacs-bug.
Stefan

Respostas:


2

Aqui estão as configurações que estou usando para corrigir o recuo:

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

Tentei consertar o recuo do Elisp em um ponto, mas foi muito complicado e desisti. Mas as configurações acima funcionaram bem por anos.


Você pode explicar brevemente o que esses formulários pute getfazem? Ele substitui as cl-fletinstâncias de função por flete cl-labelsinstâncias por labelsapenas no common-lisp-indent-function? Se sim, por que isso foi feito? Além disso, o que o terceiro colocado faz? Eu li a putdocumentação, mas ainda não fazia sentido. Seria "definir o valor da common-lisp-indent-functionpropriedade do ifsímbolo como 2", mas isso não fazia sentido para mim.
precisa saber é o seguinte

Nestes 3 casos, 'lisp-indent-function(ou seja, o padrão), é realmente melhor que 'common-lisp-indent-function. Essas configurações fazem com que o recuo seja transferido de um para o outro.
abo-abo

11
Nota: É apenas a primeira linha que responde a essa pergunta - ou seja (setq lisp-indent-function 'common-lisp-indent-function),. O resto não tem nada a ver com o recuo a ser usado para uma lista constante.
Drew
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.