Estoy tratando de crear una función que coloque / alinee / sangra las llaves según el formato de estilo Allman (para codificar en C).
En términos generales, soy fanático de la interfaz de Smartparens disponible para los usuarios para personalizar la funcionalidad. He escrito un montón de otras funciones utilizando la interfaz Smartparens, por lo que preferiría no cambiar los paquetes en este momento. Dicho esto, estoy abierto a implementaciones independientes del paquete (por ejemplo, ¿podría defadvice
ser relevante aquí?).
Sobre el problema en cuestión. ¿Cuál es el objetivo final? Supongamos que estamos codificando y alcanzamos el estado representado a continuación. El símbolo de la tubería representa el cursor; Escribí el encabezado de la función y la llave de apertura {
, y Smartparens agregó automáticamente la llave de cierre }
. En este punto, me gustaría que presionar RET
...
int main {|}
... lleva a lo siguiente:
int main
{
|
}
He podido escribir la función que produce este comportamiento, pero solo funciona para el primer nivel de sangría (por ejemplo, para nuestra función principal en el ejemplo anterior). No puedo hacer que funcione para los niveles posteriores de sangría (ver gif):
El código relevante está debajo. La función no es bonita, pero creo que debería funcionar ... La última línea es la interfaz de Smartparens.
¿Alguna sugerencia?
(defun my-create-newline-and-enter-sexp (&rest _ignored)
"Open a new brace or bracket expression, with relevant newlines and indent. "
(interactive)
(progn
(backward-char 2) (newline) (forward-char) (newline)
(indent-according-to-mode)
(previous-line 2) (indent-according-to-mode)
(next-line) (next-line) (indent-according-to-mode)))
(sp-local-pair 'c-mode "{" nil :post-handlers '((my-create-newline-and-enter-sexp "RET")))