2009-06-21 27 views
23

Ich habe ein Plugin für Vim gesehen genannt AutoClose (von this Post entdeckt), die die schließende Klammer fügt automatisch bei der Eingabe ‚(‘, ‚{‘ usw.Automatisch geschweifte Klammern in Emacs?

Zum Beispiel, wenn ich folgendes eingeben (| ist die Cursor):

int main(| 

ich das Schließen möchte ) werden automatisch für mich eingefügt:

int main(|) 

jemand eine sIM-weiß Ähnliches Feature für Emacs - Google hat mich diesmal enttäuscht!

Antwort

13

Es gibt auch 'paredit. Die cheat sheet zeigt Ihnen alle verfügbaren Befehle. Es gefällt mir besser als der elektrische Modus, der in einer anderen Antwort vorgeschlagen wird. Obwohl paredit nur für() gilt, kann es Ihre Bedürfnisse nicht berücksichtigen.

Aber, um ehrlich zu sein, gibt es eine Reihe von Paketen umgebenden Klammern. Das Wiki hat sie alle listed here. Die Modi Frage Adressierung sind:

+3

Siehe auch http://www.emacswiki.org/emacs/AutoPairs. –

+0

Und was ist, wenn ich etwas mehr brauche ... Viele Editoren verfügen über eine Funktion, die z. HTML-Tags und zusätzlich eine leere Zeile zwischen ihnen einfügen und richtige Einrückung. Wie kann ich dies in Emacs erreichen? – jesper

+1

@jesper Einige der aufgelisteten Modi können bereits das tun, was Sie möchten. Sicherlich kann der allgemeinere Modus, yasnippet (http://www.emacswiki.org/emacs/Yasnippet) tun, was Sie wollen. Es ist nicht wirklich ein Balancing-Modus für die Klammern, also werde ich ihn nicht zur Antwort hinzufügen, aber er kann tun, was du verlangst. –

15

ja, this mode is called electric. Sie können das elektrische Verhalten mit diesem einfachen Makro für maximalen Komfort kombinieren:

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

es dann aktivieren, indem Sie die entsprechenden Zeichen, um es in Ihren Lieblings-Programmiermodi verbindlich. Zum Beispiel für 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))) 

Der cperl Modus bietet dies als builtin:

;; 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! 

Andere Modi etwas ähnliches liefert könnte.

+6

Der 'electric-pair-mode' wurde in emacs 24 eingebaut und kann mit' (electric-pair-mode 1) 'verwendet werden. [link] (http://ergoemacs.org/emacs/emacs_insert_brackets_by_pair.html). – liuminzhao

+0

elektrischer Modus schließt nicht einfache Anführungszeichen und geschweifte Klammern. Wie auch immer, um das zu ermöglichen? –

+0

Just M-x anpassen Gruppe "Strom" und suchen Sie nach "Elektro-Paar-Paare". Aber seien Sie gewarnt, dass das Einstellen dieses Modus unabhängig von Ihrem Hauptmodus unklug ist - zum Beispiel im Textmodus - andere Hauptmodi bieten normalerweise Anpassung, d. Python-Einfachzitat funktioniert wie erwartet (fügt das Ende hinzu)). – bubak

5

cmarcelo hat written a wonderful post about this im Skeleton-Modus. Er zeigt auch, wie Sie die ausgewogene Klammer entfernen, wenn Sie die öffnende Klammer löschen und wie Sie mit dem Fall umgehen, dass Sie versehentlich die schließende Klammer eingeben. (Übrigens kopieren beide Verhaltensweisen TextMate).

Update:

Da ich diese Antwort geschrieben, ich habe Autopair entdeckt, die ein ziemlich perfektes System für diesen Anwendungsfall ist. Ich benutze es sehr oft und liebe es.

+0

+1 für autopair. –

+0

autopair schließt keine einfachen Anführungszeichen und geschweiften Klammern. Wie auch immer, um das zu ermöglichen? –

+0

@VineetKaushik Es hängt davon ab, in welchem ​​Modus Sie autopair verwenden. Es funktioniert gut für mich im Python-Modus. Vielleicht verwenden Sie einen Modus, in dem sie nicht als Paare betrachtet werden. Kannst du mehr darüber erzählen, was du tust? – Singletoned

5

Ich werde diesen Thread necro und bieten eine andere Alternative. Es gibt ein kürzlich gestartetes neues Projekt, das sich mit der automatischen Einfügung von Paaren, dem Einwickeln von Regionen, der Navigation um ausgewogene Ausdrücke und vielem mehr beschäftigt.Die Liste der Funktionen ist zu lang, um hier zu geben, also werde ich nur auf die smartparens github repo verweisen, wo Sie detaillierte Readme lesen können.

Es ist eine Obermenge der oben erwähnten AutoPair und bietet die meisten Kernfunktionen von pared (und erweitert auf alle Arten von verschiedenen Paaren, nicht nur diejenigen, die von Emacs Syntax-Tabellen erkannt werden).

Verwandte Themen