Provavelmente influenciado por Clojure, mais frequentemente uso listas de propriedades como estruturas de dados. O Emacs na maioria das vezes os recorta assim,
`(:token ,token
:token-quality ,quality) ,
enquanto isso é o que eu preferiria
`(:token ,token
:token-quality ,quality) .
Então, eu me pergunto, se alguém já abordou isso?
Fuco1/lisp-indent-function
e fazer(add-hook 'emacs-lisp-mode-hook (lambda () (setq-local lisp-indent-function #'Fuco1/lisp-indent-function)))
Respostas:
Isso pode ser alcançado alterando o modo
lisp-indent-function
for emacs-lisp:A partir
lisp-mode.el
de fonte emacs,Alternativo
Como o @wasamasa mencionado em um comentário à pergunta, o @ Fuco1 (no github.com) modificou o padrão
lisp-indent-function
para corrigir o recuo das palavras-chave (começando com:
).O Emacs forneceu a variável
lisp-indent-function
para o usuário escolher qual função usar para indentação nos modos lisp.Em vez de substituir a definição da função original, podemos criar nossa própria função e atribuir a variável acima ao nome dessa função.
Neste exemplo,
Fuco1/lisp-indent-function
na configuração do emacsemacs-lisp-mode
:Referência
A função modificada é colada abaixo no caso de a fonte referenciada ao github ser perdida.
fonte
lisp-indent-function
.(setq lisp-backquote-indentation nil)
de listas com aspas posteriores (como na pergunta original).Introdução ao calcul-lisp-indent
Uma solução melhor é substituir a função
calculate-lisp-indent
. Em resumo,calculate-lisp-indent
é uma função que retorna a coluna à qual uma linha no ponto deve ser recuada. Esta função é o que informalisp-indent-function
quanto cada linha deve ser recuada. (veja também meu post no reddit para mais informações).Comparação com outras respostas
A vantagem que esta resposta tem sobre o uso da função modificada do Fuco1 é que (1) corrige a raiz do problema que está em
calculate-lisp-indent
vez de apenas limpar após o recuo incorreto retornado porcalculate-lisp-indent
(2) generaliza para listas citadas e citadas (e funciona se eles são citados / citados explicitamente ou com o'
e `). Também funciona com aspas e aspas aninhadas arbitrariamente.A vantagem que essa resposta tem sobre a substituição
lisp-indent-function
pelacommon-lisp-indent-function
função é que ela não tem o efeito colateral de atrapalhar outro recuo do elisp. Elisp e common-lisp são recuados de maneira diferente.Como funciona
Esse condicional (in
calculate-lisp-indent
) é o que decide se um sexp é recuado como uma função ou não. O que se encaixa na outra cláusula é recuado como uma função. O que se enquadra na cláusula if if é recuado normalmente (no elemento atual). Para fazê-lo recuar listas entre aspas como dados e não como funções, precisamos adicionar mais verificações nos casos em que a lista é citada no predicado condicional.Esse código verifica os parênteses abertos do sexp que está sendo recuado. Se for sexp com vários sexp, ele verifica todos. Retorna t se encontrar algum sexps entre aspas ou com aspas.
Bônus
Se você deseja que qualquer lista que comece com uma palavra-chave seja recuada como dados, mesmo que não esteja entre aspas, adicione-a como outra verificação ao predicado condicional. Isso pode ser útil para macros nas quais as listas não são citadas por conveniência, como no defhydra .
Exemplos
O snippet de código completo que publiquei abaixo funciona com o caso que você mencionou e muito mais. Por favor, experimente!
Para uma explicação mais detalhada de como isso funciona, veja meu post no reddit .
Snippet de código completo
Aqui está o trecho de código completo.
Notas Finais
Vale a pena notar que essa questão seria melhor generalizada como como impedir o emacs de recuar listas citadas e não citadas como funções .
fonte
Para uma alternativa muito mais obscura à resposta de kaushalmodi, você pode substituir o
lisp-indent-function
semelhante ao que Mark H. Weaver fez parascheme-indent-function
corrigir o alinhamento de palavras-chave no Guile Scheme.Acabei de copiar o código de http://netris.org/~mhw/scheme-indent-function.el ; a única alteração é adicionar uma nova
cond
cláusula. Você podelisp-indent-function
usar o código atual em vez de usar esta função como está.(É uma pena que as funções de recuo não exponham mais ganchos para simplificar pequenas alterações como essa.)
fonte
lisp-indent-function
? Também não parece haver uma funçãoemacs-lisp-indent-function
.lisp-indent-function
contém a função de indentação por padrão. A atribuição a essa variável é idêntica à substituição da função de indentação padrão para o modo emacs-lisp. (Você está certo, não há nenhuma especialemacs-lisp-indent-function
, é sólisp-indent-function
.)Você pode substituir de
lisp-indent-function
maneira preparada para o futuro usando meu pacote el-patch :Isso corrige o problema para mim; veja isso em contexto .
fonte