2010-09-27 14 views
6

Acabo de empezar a usar emacs, y hay una característica que realmente me gustaría, y buscar un poco fue infructuoso. Espero que alguien más haya hecho esto porque todavía no quiero aprender elisp.¿Cómo puedo obtener emacs para insertar llaves de cierre automáticamente?

void foo()<cursor> 

me gustaría escribir un "{" para hacer que esto suceda

void foo(){ 
    <cursor> 
} 

me gustaría que esto solamente ocurrirá en cc-modo, y sólo al final de una línea no cuando en una cadena/comentario/etc

Lo primero que se me vino a la mente fue volver a enlazar "{" para hacer esto siempre (podría averiguar cómo hacerlo yo mismo), pero sería difícil hacerlo solo en el tiempo correcto.

cualquier sugerencia sería apreciada.

+0

creo que esto es duplicado de http://stackoverflow.com/questions/1023770/automatically-closing-braces-in-emacs –

+0

Miré a esa pregunta, pero era sólo acerca de la adición del paréntesis de cierre/corsé/etc. Quiero que renueve dos veces, sangría y vuelva a colocar el cursor en la línea vacía también – Bwmat

Respuesta

5

Esto lo hará:

(defun my-c-mode-insert-lcurly() 
    (interactive) 
    (insert "{") 
    (let ((pps (syntax-ppss))) 
    (when (and (eolp) (not (or (nth 3 pps) (nth 4 pps)))) ;; EOL and not in string or comment 
     (c-indent-line) 
     (insert "\n\n}") 
     (c-indent-line) 
     (forward-line -1) 
     (c-indent-line)))) 

(define-key c-mode-base-map "{" 'my-c-mode-insert-lcurly) 
+0

gracias, esto funcionó muy bien. – Bwmat

2

Pruebe yasnippet (o en la página Wiki de Emacs yasnippet). Hay muchos paquetes para Emacs que soportan hacer este tipo de cosas, pero yasnippet parece tener momentum actualmente y es muy extensible. Mira los videos.

+0

Eso se ve muy bien, lo investigaré – Bwmat

+0

Esto no parece ser ideal, necesito presionar la pestaña para expandirlo y no funciona si no hay un espacio entre el "{" y lo que está delante de él. – Bwmat

+0

Probablemente podría modificar a plantilla para eliminar el espacio. Modificar/crear plantillas es bastante fácil. –

1

Tendrá que profundizar en emacs-lisp para hacer esto exactamente como desee, ya que YASnippet hará algo bueno por usted pero no exactamente lo que está solicitando.

Creo que la forma más sencilla de hacerlo sería vincular una función a la clave RET, en el mapa de teclas cc-mode.

La función debe comprobar que el carácter anterior es un { y si es así, lleve a cabo la necesaria RET, RET, TAB, }, Hasta, TAB llegar el cursor donde desea y el de cierre} insertado.

Puede hacer que la característica sea más robusta haciendo que busque un cierre balanceado }, pero esto sería más complicado, y le recomendaría ver cómo se siente sin esta función adicional de pulido.

Si desea puedo escribir la función y el enlace del mapa de teclas para usted, pero ya que me pidió una idea de cómo se hace, le dejaré que pida más ayuda si la necesita .

Alternativamente, considero que autopair.el lo hace lo suficientemente bien para mí, y yo los saltos de línea a mí mismo;)

+0

eso es lo que pensé. ¿Hay alguna manera fácil de, dentro de la función de lisp, verificar si estoy en un comentario/cadena y si estoy al final de la línea? Sé que cc-mode hace esto internamente y sería realmente fácil si pudiera usar eso. – Bwmat

+0

Puede usar punto por punto para determinar en qué contexto se encuentra. – ocodo

3

lo recomiendo que pruebe la excelente modo menor autopair - lo hace mucho más que simplemente insertar llaves y hace que Emacs sea mucho más IDE que en esa área. Supongo que combinarlo con la configuración de llaves eléctricas en modo cc le dará más o menos el comportamiento que busca.

8

sobre las últimas emacs que puede utilizar:

electric-pair-mode is an interactive compiled Lisp function. 

(electric-pair-mode &optional ARG) 

Automatically pair-up parens when inserting an open paren. 

este está integrado en Emacs 24.1 (en realidad CVS)

1

Es posible que desee mantener el opción de un cuerpo de función vacío, en cuyo caso, desearía que el corsé de cierre permanezca en la misma línea. Si ese es el caso, entonces puede probar esta solución alternativa:

  1. Confíe en los paquetes mencionados en las respuestas anteriores para agregar automáticamente la llave de cierre.
  2. Cuando desee agregar instrucciones al cuerpo de la función, presione la tecla Return (mientras que el parche de cierre agregado automáticamente aún está debajo del cursor). La clave 'Return' está obligado como sigue:

    ;; automatic first line in function            
    (defun my-c-mode-insert-funline() 
        (interactive) 
        (newline-and-indent) 
        (when (looking-at "}") 
        (newline-and-indent) 
        (forward-line -1) 
        (c-indent-line))) 
    (global-set-key (kbd "RET") 'my-c-mode-insert-funline) 
    
2

su vez en par-modo eléctrico en emacs 24 o una versión.

(electric-pair-mode 1) 
Cuestiones relacionadas