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")))
fuente
Resuelto La secuencia de movimientos del cursor de mi primera versión (en la publicación original) fue funky.
Como referencia para futuros lectores, el siguiente código debería funcionar. Obv necesita el paquete Smartparens (que puede obtener de git-hub). Estoy ejecutando Emacs 24.4. Funciona con el modo de sangría eléctrica habilitado o deshabilitado.
Y también deberá incluir lo siguiente en su archivo de inicio, en algún lugar después de cargar el paquete Smartparens:
fuente
previous-line
lasearch-forward
de tratar de re-descubrir dónde estaba usted, usted es mucho mejor recordar su posición en una variable y luego sólo tiene que utilizargoto-char
.save-excursion
pero estoy seguro de que hay otros que no conozco.Otra forma, terser, es utilizar una
smartparens
especificación de inserción .fuente
Aquí está el código que uso, solo para darle más ideas para enmendar su código:
Prefiero el estilo de abrazadera colgante, ya que ahorra espacio.
fuente