Автоматически закрывать скобки в Emacs? - PullRequest
28 голосов
/ 21 июня 2009

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

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

int main(|

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

int main(|)

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

Ответы [ 4 ]

16 голосов
/ 21 июня 2009

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

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

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

15 голосов
/ 21 июня 2009

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

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

5 голосов
/ 27 декабря 2012

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

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

5 голосов
/ 21 июня 2009

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

Обновление:

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

...