2010-10-21 10 views
6

Ho usato XCode e Netbeans e ho notato che hanno una funzionalità per completare automaticamente virgolette o parentesi (e presumo che anche altri IDE lo facciano spesso). Non so quale sia il nome di questa funzione, ma esiste un modo per farlo in Emacs?È possibile completare automaticamente le parentesi o le virgolette in emacs?

Ad esempio, quando si digita

printf(" 

desidero quest'ultima all'ingresso automaticamente

printf("") 

posizionando il cursore tra le virgolette.

Grazie.

+0

Ho usato una simile macro in precedenza, ma oggi uso così tanti editor diversi (emacs, vs, eclipse, pn) che non ho potuto fare affidamento su una funzione del genere. Invece ho interiorizzato questo comportamento e riesco a malapena a digitare un carattere di sinistra senza inserire in modo riflessivo il corrispondente carattere bilanciato. I non programmatori che mi vedono fare questo pensano che io sia strano. – Zano

risposta

7

La variante di base sarebbe AutoPairs. Lo stesso effetto ma un po 'più sofisticato può essere raggiunto anche con YASnippet.

+0

Sembra che AutoPairs e Paredit siano i due suggerimenti popolari, ma sembra che AutoPairs sia stato integrato bene con YASnippet, il che è utile per un ulteriore completamento del codice. – beardc

3

Se si digita M- (, che inserirà sia un punto (e un) che un punto di separazione tra di essi, se si digita M-), ciò sposterà il punto attraverso la chiusura). Lo uso sempre.

C'è anche una modalità chiamata "paredit" (disponibile da http://mumble.net/~campbell/emacs/paredit.el) che fa questo genere di cose anche per le virgolette, e probabilmente altre cose.

+0

Nella mia configurazione, 'M-)' è associato a 'move-past-close-and-reindent', cioè apre una nuova riga. Esiste la possibilità di passare oltre il parentese che racchiude senza reindentarlo? – phimuemue

+0

'M-- C-M-u' potrebbe fare quello che vuoi. – offby1

3

La modalità Paredit inserisce gli elementi di chiusura corrispondenti per impostazione predefinita, quindi durante la digitazione vedrai qualcosa come printf() quindi printf("") e il cursore verrà posizionato all'interno delle virgolette.

0

La modalità minore autopair fa esattamente quello che chiedi.

2

Anche i miei 5 centesimi.

(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) 

consiglio successivo consentirà al backspace alle cancella le coppie: una (|) 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)))) 

consiglio successivo farà backward-kill-word (per me è M-backspace) per eliminare il par corrispondente anche se separato da altro testo; molto maneggevole.

(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)) 

Sto cercando di passare ora a paredit, però.

+0

Dal momento che gli Autopar non sembrano eliminare automaticamente le coppie, questo consiglio di abbinamento all'indietro elimina sembra un ottimo supplemento. – beardc

Problemi correlati