Probablemente influenciado por Clojure, uso más a menudo las listas de propiedades como estructuras de datos. Emacs la mayoría de las veces los sangra así,
`(:token ,token
:token-quality ,quality) ,
mientras esto es lo que preferiría
`(:token ,token
:token-quality ,quality) .
Entonces, me pregunto, ¿si alguien ya ha abordado esto?
Fuco1/lisp-indent-function
y haga(add-hook 'emacs-lisp-mode-hook (lambda () (setq-local lisp-indent-function #'Fuco1/lisp-indent-function)))
Respuestas:
Eso se puede lograr cambiando el modo
lisp-indent-function
for emacs-lisp:De
lisp-mode.el
en fuente de emacs,Alternativa
Como @wasamasa mencionó en un comentario a la pregunta, @ Fuco1 (en github.com) ha modificado el valor predeterminado
lisp-indent-function
para corregir la sangría de las palabras clave (comenzando por:
).Emacs ha proporcionado la variable
lisp-indent-function
para que el usuario elija qué función usar para la sangría en los modos lisp.En lugar de anular la definición de función original, podemos crear nuestra propia función y asignar la variable anterior a ese nombre de función.
En este ejemplo,
Fuco1/lisp-indent-function
en su configuración de emacsemacs-lisp-mode
:Referencia
La función modificada se pega a continuación en caso de que se pierda la fuente referenciada a github.
fuente
lisp-indent-function
.(setq lisp-backquote-indentation nil)
para listas entre comillas (como en la pregunta original)Introducción para calcular-lisp-indent
Una mejor solución es anular la función
calculate-lisp-indent
. En resumen,calculate-lisp-indent
es una función que devuelve la columna a la que se debe sangrar una línea en el punto. Esta función es la que informalisp-indent-function
cuánto debe sangrarse cada línea. (vea también mi publicación en reddit para más información).Comparación con otras respuestas
La ventaja que tiene esta respuesta sobre el uso de la función modificada de Fuco1 es que (1) corrige la raíz del problema que se encuentra en
calculate-lisp-indent
lugar de simplemente limpiar después de la sangría incorrecta devuelta porcalculate-lisp-indent
(2) se generaliza a las listas citadas y citadas (y funciona si se citan / retrocomponen explícitamente o con el'
y `). También funciona con comillas y comillas invertidas arbitrariamente anidadas.La ventaja que tiene esta respuesta sobre el reemplazo
lisp-indent-function
con lacommon-lisp-indent-function
función es que no tiene el efecto secundario de estropear otra sangría de elisp. Elisp y common-lisp tienen sangría diferente.Cómo funciona
Este condicional (in
calculate-lisp-indent
) es lo que decide si un sexp está sangrado como una función o no. Lo que cae en su cláusula else está sangrado como una función. Lo que cae dentro de la cláusula if es sangrado normalmente (debajo del elemento actual). Para sangrar las listas citadas como datos en lugar de como funciones, necesitamos agregar más verificación para los casos en los que la lista se cita en el predicado condicional.Este código verifica los paréntesis abiertos del sexp que se sangra. Si es sexp con múltiples sexp, los verifica a todos. Devuelve t si encuentra algún sexps citado o retrocomillado.
Prima
Si desea que una lista que comienza con una palabra clave se sangra como datos, incluso si no está entre comillas, agregue esto como otra verificación al predicado condicional. Esto puede ser útil para macros en las que las listas no se citan por conveniencia, como en defhydra .
Ejemplos
El fragmento de código completo que he publicado a continuación funciona con el caso que ha mencionado y más. Por favor pruébalo!
Para una explicación más detallada de cómo funciona esto, vea mi publicación en reddit .
Fragmento de código completo
Aquí está el fragmento de código completo.
Notas finales
Vale la pena señalar que esta pregunta se generalizaría mejor sobre cómo evitar que emacs sangre las listas citadas y no citadas como funciones .
fuente
Para una alternativa mucho más pirata a la respuesta de kaushalmodi, podría sobrescribir lo
lisp-indent-function
similar a lo que Mark H. Weaver hizo parascheme-indent-function
corregir la alineación de las palabras clave en Guile Scheme.Acabo de copiar el código de http://netris.org/~mhw/scheme-indent-function.el ; El único cambio es agregar una nueva
cond
cláusula. Es posible que desee tomar el código actual enlisp-indent-function
lugar de usar esta función tal como está.(Es una pena que las funciones de sangría no expongan más ganchos para simplificar cambios menores como este).
fuente
lisp-indent-function
? Además, no parece haber una funciónemacs-lisp-indent-function
.lisp-indent-function
contiene la función de sangría por defecto. Asignar a esta variable es idéntico a sobrescribir la función de sangría predeterminada para el modo emacs-lisp. (Tienes razón, no hay nada especialemacs-lisp-indent-function
, es sololisp-indent-function
.)Puede anular
lisp-indent-function
de una manera a prueba de futuro usando mi paquete el-patch :Esto soluciona el problema para mí; verlo en contexto .
fuente