2010-10-21 12 views
6

He usado XCode y Netbeans, y me he dado cuenta de que tienen una función para completar automáticamente comillas o paréntesis (y supongo que otros IDE a menudo también lo hacen). No sé cuál es el nombre de esta característica, pero ¿hay alguna forma de hacerlo en Emacs?¿Es posible autocompletar paréntesis o comillas en emacs?

Por ejemplo, cuando escribo

printf(" 

me gustaría que a la entrada automáticamente

printf("") 

colocando el cursor entre las comillas.

Gracias.

+0

He usado un macro como antes, pero uso tantos editores diferentes hoy (emacs, vs, eclipse, pn) que no podía confiar en tal característica. En cambio, interioricé este comportamiento y apenas puedo escribir un carácter del lado izquierdo sin insertar reflexivamente el carácter equilibrado correspondiente. Los no programadores que me ven haciendo esto piensan que soy raro. – Zano

Respuesta

7

La variante básica sería AutoPairs. El mismo efecto pero un poco más sofisticado también se puede lograr con YASnippet.

+0

Parecía que AutoPairs y Paredit son las dos sugerencias populares, pero parece que AutoPairs está hecho para integrarse bien con YASnippet, lo que es bueno para la finalización del código. – beardc

3

Si escribe M- (, que insertará tanto un (y a), como un punto intermedio, si escribe M-), eso moverá el punto a través del cierre). Uso esto todo el tiempo.

También hay un modo llamado "paredit" (disponible en http://mumble.net/~campbell/emacs/paredit.el) que hace este tipo de cosas también para citas, y probablemente otras cosas.

+0

En mi configuración, 'M-)' está obligado a 'move-past-close-and-resindent', es decir, abre una nueva línea. ¿Existe la posibilidad de pasar el paréntesis que los rodea sin volver a enrojecer? – phimuemue

+0

'M-- C-M-u' podría hacer lo que quiera. – offby1

3

Las inserciones en modo Paredit coinciden con los elementos de cierre de forma predeterminada, de modo que mientras se escribe se verá algo como printf() y luego printf("") y el cursor se colocará entre comillas.

0

El modo secundario autopair hace exactamente lo que usted solicita.

2

Mi 5 centavos aquí también.

(setq skeleton-pair t) 
(defvar skeletons-alist 
    '((?\(. ?\)) 
    (?\" . ?\") 
    (?[ . ?]) 
    (?{ . ?}) 
    (?$ . ?$))) 

(global-set-key (kbd "(") 'skeleton-pair-insert-maybe) 
(global-set-key (kbd "[") 'skeleton-pair-insert-maybe) 
(global-set-key (kbd "\"") 'skeleton-pair-insert-maybe) 
(global-set-key (kbd "\'") 'skeleton-pair-insert-maybe) 

siguiente consejo permitirá al retroceso que elimina los pares: un (|) b -> ab

(defadvice delete-backward-char (before delete-empty-pair activate) 
    (if (eq (cdr (assq (char-before) skeletons-alist)) (char-after)) 
     (and (char-after) (delete-char 1)))) 

consejos A continuación hará backward-kill-word (para mí es M-retroceso) para eliminar el par coincidente incluso si está separado por otro texto; muy útil.

(defadvice backward-kill-word (around delete-pair activate) 
    (if (eq (char-syntax (char-before)) ?\() 
     (progn 
(backward-char 1) 
(save-excursion 
    (forward-sexp 1) 
    (delete-char -1)) 
(forward-char 1) 
(append-next-kill) 
(kill-backward-chars 1)) 
    ad-do-it)) 

Estoy tratando de pasar ahora a ser un crédito, sin embargo.

+0

Dado que Autopairs no parece eliminar automáticamente los pares, este consejo de pares hacia atrás parece un gran complemento. – beardc

Cuestiones relacionadas