2009-06-21 3 views
23

Я видел плагин для Vim называется AutoClose (обнаруженный из this поста), который автоматически добавляет закрывающую скобку при наборе «(», «{» и т.д.Автоматическое закрытие брекетов в Emacs?

Например, когда я печатаю следующее (| является курсор):

int main(| 

Я хотел закрытия ) быть вставлен автоматически для меня:

int main(|) 

кто-нибудь знает сима Илала для emacs - на этот раз Google провалил меня!

ответ

13

Существует также 'paredit. cheat sheet показывает все доступные команды. похоже, лучше, чем электрический режим, предложенный в другом ответе. Хотя paredit применим только к(), он может не соответствовать вашим потребностям.

Но, честно говоря, есть куча пакетов, окружающих круглые скобки. У вики есть все они listed here. Режимы адресации Ваш вопрос:

+3

См. Также http://www.emacswiki.org/emacs/AutoPairs. –

+0

И что, если мне нужно что-то еще ... Многие редакторы имеют функцию автоматического закрытия, например. html и, кроме того, вставить пустую строку между ними и сделать правильный отступ. Как я могу достичь этого в emacs? – jesper

+1

@jesper Некоторые из перечисленных режимов могут уже делать то, что вы хотите. Конечно, более общий режим, yasnippet (http://www.emacswiki.org/emacs/Yasnippet) может делать то, что вы хотите. Это не режим балансировки в скобках, поэтому я не буду добавлять его в ответ, но он может делать то, что вы просите. –

15

есть, this mode is called electric. Вы можете комбинировать электрическое поведение с помощью этого простого макроса для максимальной 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))) 

Затем включите его путем связывания соответствующих символов в ней в ваших любимых режимах программирования. Например, для 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))) 

Режим CPerl обеспечивает это как встроенной команды:

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

Другие режимы могли обеспечивает что-то подобное.

+6

«electric-pair-mode» был построен в emacs 24 и может использоваться '(electric-pair-mode 1)'. [Ссылка] (http://ergoemacs.org/emacs/emacs_insert_brackets_by_pair.html). – liuminzhao

+0

Электрический режим не закрывает одинарные кавычки и фигурные скобки. В любом случае, чтобы это сделать? –

+0

Просто M-x настройте группу «электричество» и ищите «пары электрических пар». Но будьте осторожны, чтобы установить это независимо от вашего основного режима, может быть неразумным - например, в текстовом режиме - другие основные режимы обычно обеспечивают настройку, т.е. Одинарная кавычка Python работает, как и ожидалось (добавляет конечную)). – bubak

5

cmarcelo имеет written a wonderful post about this используя скелет режим. Он также показывает, как удалить сбалансированный кронштейн, если вы удалите открывающий кронштейн и как справиться со случаем, когда вы случайно набираете закрывающий кронштейн. (Кстати, оба поведения копируют TextMate).

Update:

Так как я писал этот ответ, я обнаружил Autopair, который является в значительной степени идеальной системой для этого случая использования. Я использую его много и люблю его.

+0

+1 для автопарка. –

+0

Автопарк не закрывает одиночные кавычки и фигурные скобки. В любом случае, чтобы это сделать? –

+0

@VineetKaushik Это зависит от того, в каком режиме вы используете автопарк. Он отлично работает для меня в режиме Python. Возможно, вы используете режим, в котором они не считаются парами. Можете ли вы дать более подробную информацию о том, что вы делаете? – Singletoned

5

Я собираюсь вкрутить эту тему и предоставить другую альтернативу. Недавно был запущен новый проект, посвященный автоматической вставке пар, упаковке регионов, навигации по сбалансированным выражениям и многим другим.Список функций слишком длинный, чтобы дать здесь, поэтому я просто свяжусь с smartparens github repo, где вы можете прочитать подробное чтение.

Это надмножество вышеупомянутого автопарка и обеспечивает большинство основных функций paredit (и распространяется на все виды разных пар, а не только на те, которые распознаются синтаксическими таблицами emacs).