2010-10-21 12 views
6

Użyłem XCode i Netbeans, i zauważyłem, że mają funkcję automatycznego uzupełniania cudzysłowów lub nawiasów (i zakładam, że inne IDE często to też robią). Nie wiem, jaka jest nazwa tej funkcji, ale czy jest jakiś sposób, aby to zrobić w Emacs?Czy możliwe jest automatyczne uzupełnianie nawiasów lub cudzysłowów w emacs?

Na przykład, gdy typ

printf(" 

to, że jak to automatycznie wejście

printf("") 

umieszczając kursor między cudzysłowach.

Dziękuję.

+0

Użyłem takiego makra wcześniej, ale używam tak wielu różnych edytorów dzisiaj (emacs, vs, eclipse, pn), że nie mogłem polegać na takiej funkcji. Zamiast tego zinternalizowałem to zachowanie i ledwo mogłem wpisać lewą stronę bez odruchowego wstawiania odpowiedniego zrównoważonego znaku. Nie-programiści, którzy widzą, że to robię, uważają mnie za dziwaka. – Zano

Odpowiedz

7

Podstawowym wariantem będzie AutoPairs. Ten sam efekt, ale nieco bardziej wyrafinowany, można również osiągnąć dzięki YASnippet.

+0

Wyglądało na to, że AutoPairs i Paredit to dwie popularne propozycje, ale wygląda na to, że AutoPairs jest dobrze zintegrowana z YASnippet, co jest dobre dla dalszego kodowania. – beardc

3

Jeśli wpiszesz M- (, które wstawi zarówno a (i a), jak i zostaw punkt pomiędzy, jeśli wpiszesz M-), spowoduje to przesunięcie punktu w kierunku zamknięcia). Używam tego cały czas.

Istnieje również tryb o nazwie "paredit" (dostępny od http://mumble.net/~campbell/emacs/paredit.el), który robi tego rodzaju rzeczy również w przypadku cytatów i prawdopodobnie innych rzeczy.

+0

W mojej konfiguracji, 'M-)' jest związane z 'move-past-close-and-reindent', tj. Otwiera nową linię. Czy istnieje możliwość, aby po prostu przejść obok otaczającego nawiasu bez ponownego wracania? – phimuemue

+0

'M-- C-M-u' może zrobić, co chcesz. – offby1

3

Tryb pared domyślnie wstawia pasujące elementy zamykające, więc podczas pisania pojawi się coś takiego jak printf(), następnie printf(""), a kursor zostanie umieszczony w cudzysłowie.

0

Tryb pomocniczy autopair wykonuje dokładnie to, o co prosisz.

2

Moje 5 centów również tutaj.

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

Następny rada pozwoli Backspace celu usunięcie pary: a (|) 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)))) 

Następny rada uczyni backward-kill-word (dla mnie jest M-Backspace) aby usunąć pasujący par, nawet jeśli jest oddzielony innym tekstem; bardzo przydatny.

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

Próbuję teraz przejść do pared.

+0

Ponieważ Autopairs nie wydaje się automatycznie usuwać par, ta informacja o parach od tyłu wygląda na wspaniały dodatek. – beardc

Powiązane problemy