2009-06-21 21 views
23

widziałem wtyczkę do Vima nazywa AutoClose (odkrytą od this Post), który automatycznie dodaje nawiasu zamykającego podczas wpisywania „(”, „{” itpAutomatyczne zamykanie aparatów w Emacs?

Na przykład, po wpisaniu następujących (| jest kursor):

int main(| 

Chciałbym zamykanie ) być wstawiane automatycznie do mnie:

int main(|) 

Czy ktoś wie o sim Funkcja ilara dla emacsa - tym razem mnie zawiodło!

Odpowiedz

13

Istnieje również 'paredit. cheat sheet pokazuje wszystkie dostępne polecenia. lubić to lepiej niż tryb elektryczny sugerowany w innej odpowiedzi. Chociaż parytet ma zastosowanie tylko do(), więc nie może zaspokoić twoich potrzeb.

Ale, szczerze powiedziawszy, w nawiasach jest mnóstwo paczek. Wiki ma je wszystkie listed here. Tryby adresowania pytanie to:

+3

Zobacz także http://www.emacswiki.org/emacs/AutoPairs. –

+0

A jeśli potrzebuję czegoś więcej ... Wielu edytorów ma funkcję automatycznego zamykania, np. znaczniki html, a dodatkowo wstawiaj między nimi pustą linię i wykonaj odpowiednie wcięcie. Jak mogę to osiągnąć w emacs? – jesper

+1

@jesper Niektóre z wymienionych trybów mogą już robić, co chcesz. Na pewno bardziej ogólny tryb, yasnippet (http://www.emacswiki.org/emacs/Yasnippet) może robić, co chcesz. Nie jest to tak naprawdę tryb równoważenia nawiasów, więc nie dodam go do odpowiedzi, ale może zrobić to, o co prosisz. –

15

tak, this mode is called electric. Można łączyć zachowanie elektrycznego z tego prostego makra dla maksymalnej confort:

(defun electric-pair() 
    "If at end of line, insert character pair without surrounding spaces. 
    Otherwise, just insert the typed character." 
    (interactive) 
    (if (eolp) (let (parens-require-spaces) (insert-pair)) 
    (self-insert-command 1))) 

Potem ją włączyć poprzez wiązanie odpowiednie znaki do niej w swoich ulubionych trybach programowania. Na przykład, dla PythonMode:

(add-hook 'python-mode-hook 
      (lambda() 
      (define-key python-mode-map "\"" 'electric-pair) 
      (define-key python-mode-map "\'" 'electric-pair) 
      (define-key python-mode-map "(" 'electric-pair) 
      (define-key python-mode-map "[" 'electric-pair) 
      (define-key python-mode-map "{" 'electric-pair))) 

Tryb CPerl zapewnia to jako polecenie wbudowane:

;; from my .emacs 
(add-hook 'cperl-mode-hook 
    (lambda() 
    (setq cperl-hairy nil 
     abbrev-mode t  ;; automatic keyword expansion 
     cperl-highlight-variables-indiscriminately t 
     cperl-auto-newline t 
     cperl-auto-newline-after-colon t 
     cperl-regexp-scan nil 
     cperl-electric-keywords t 
     cperl-electric-linefeed t 
     cperl-electric-parens nil) ;; <------ electric parens! 

Inne tryby mogłyby zapewnia coś podobnego.

+6

"Tryb pary elektrycznej" został zbudowany w emacs 24 i może być używany przez '(tryb pary elektronicznej 1). [link] (http://ergoemacs.org/emacs/emacs_insert_brackets_by_pair.html). – liuminzhao

+0

Tryb elektryczny nie zamyka pojedynczych cudzysłowów i nawiasów klamrowych. W każdym razie, aby to umożliwić? –

+0

Po prostu M-x dostosuj grupę "elektryczność" i poszukaj "pary elektryczno-parowych". Należy jednak pamiętać, że ustawienie tego bez względu na tryb główny może być nierozsądne - na przykład w trybie tekstowym - inne główne tryby zwykle zapewniają dostosowanie, tj. Python pojedynczy cytat działa zgodnie z oczekiwaniami (dodaje końcowy)). – bubak

5

cmarcelo ma written a wonderful post about this przy użyciu trybu szkieletu. Pokazuje także, jak usunąć zblokowany nawias, jeśli usuniesz nawias otwierający i jak zajmiesz się przypadkiem, w którym przypadkowo wpiszesz nawias zamykający. (Nawiasem mówiąc, oba zachowania kopiują TextMate).

Aktualizacja:

Od kiedy pisał tę odpowiedź, odkryłem Autopair który jest prawie idealny układ dla tego przypadku użycia. Używałem go dużo i kochałem to.

+0

+1 do autopairu. –

+0

autopair nie zamyka pojedynczych cudzysłowów i nawiasów klamrowych. W każdym razie, aby to umożliwić? –

+0

@VineetKaushik Zależy od tego, w jakim trybie korzystasz z autopairu. To działa dobrze dla mnie w trybie Python. Być może używasz trybu, w którym nie są uważane za pary. Czy możesz podać więcej szczegółów na temat tego, co robisz? – Singletoned

5

Zamierzam nekroć ten wątek i podać inną alternatywę. Jest to niedawno rozpoczęty nowy projekt, który zajmuje się automatycznym wstawianiem par, zawijaniem regionów, nawigacją wokół wyrażeń zbalansowanych i wiele więcej.Lista funkcji jest zbyt długa, aby ją tutaj podać, dlatego po prostu utworzę link do smartparens github repo, gdzie można przeczytać szczegółowy plik readme.

Jest to nadzbiór wyżej wymienionej AutoPair i zapewnia większość podstawowych cech paredit (i rozszerzony na wszystkie rodzaje różnych par, nie tylko te rozpoznawane przez tabacapy składni emacsa).

Powiązane problemy