Автоматически закрывающие фигурные скобки в Emacs?

Я видел плагин для Vim под названием AutoClose (обнаружен из это сообщение), автоматически добавляет закрывающую скобку при вводе '(', '{' и т. д.

Например; когда я набираю следующее (| - курсор):

int main(|

Я хочу, чтобы закрывающий ) был автоматически вставлен для меня:

int main(|)

Кто-нибудь знает о подобной функции для emacs - на этот раз Google подвел меня!


person DaveR    schedule 21.06.2009    source источник


Ответы (4)


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

Но, честно говоря, вокруг скобок есть множество пакетов. В вики все они перечислены здесь. Режимы ответа на ваш вопрос:

person Trey Jackson    schedule 21.06.2009
comment
А что, если мне нужно что-то еще ... Многие редакторы имеют функцию автоматического закрытия, например. html и, кроме того, вставьте между ними пустую строку и сделайте правильный отступ. Как я могу добиться этого в emacs? - person jesper; 29.11.2010
comment
@jesper Некоторые из перечисленных режимов могут уже делать то, что вы хотите. Конечно, более общий режим, yasnippet (emacswiki.org/emacs/Yasnippet) может делать то, что вы хотите. На самом деле это не режим балансировки скобок, поэтому я не буду добавлять его к ответу, но он может делать то, что вы просите. - person Trey Jackson; 29.11.2010
comment
Начиная с Emacs 24.4. Автор autopair рекомендует использовать вместо этого electric-pair-mode. - person azzamsa; 09.07.2018

да, этот режим называется электрическим. Вы можете комбинировать электрическое поведение с этим простым макросом для максимального комфорта:

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

В других режимах может быть что-то подобное.

person dfa    schedule 21.06.2009
comment
electric-pair-mode был встроен в emacs 24 и может использоваться (electric-pair-mode 1). ссылка. - person liuminzhao; 25.10.2013
comment
электрический режим не закрывает одинарные кавычки и фигурные скобки. Во всяком случае, чтобы включить это? - person Flame of udun; 13.03.2015
comment
Просто M-x настройте группу «электричество» и найдите «электрические пары-пары». Но имейте в виду, что установка этого параметра независимо от вашего основного режима может быть неразумной - например, в текстовом режиме - другие основные режимы обычно предоставляют настройку, т.е. Одиночная кавычка Python работает должным образом (добавляет последнюю). - person bubak; 01.04.2015

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

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

person Matus Goljer    schedule 27.12.2012
comment
Также стоит отметить: по умолчанию smartparens всегда вставляет пару, что может раздражать. Но он также допускает альтернативное поведение, когда вставляет только пару на основе эвристики. Подробнее см. этот файл, который распространяется в smartparens. упаковка. - person Hi-Angel; 17.12.2020

cmarcelo написал об этом замечательный пост, используя скелет. режим. Он также показывает, как удалить сбалансированную скобку, если вы удалите открывающую скобку, и как поступить в случае, когда вы случайно набираете закрывающую скобку. (Между прочим, оба поведения копируют TextMate).

Обновлять:

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

person Singletoned    schedule 21.06.2009
comment
autopair не закрывает одинарные кавычки и фигурные скобки. Во всяком случае, чтобы включить это? - person Flame of udun; 13.03.2015
comment
@VineetKaushik Это зависит от того, в каком режиме вы используете автопарку. У меня он отлично работает в режиме Python. Возможно, вы используете режим, в котором они не считаются парами. Не могли бы вы подробнее рассказать о том, что делаете? - person Singletoned; 13.03.2015