Можно ли автоматически заполнять скобки или кавычки в emacs?

Я использовал XCode и Netbeans и заметил, что у них есть функция автоматического завершения кавычек или круглых скобок (и я предполагаю, что другие IDE также часто делают это). Я не знаю, как называется эта функция, но есть ли способ сделать это в Emacs?

Например, когда я печатаю

printf("

Я хотел бы, чтобы он автоматически вводил

printf("")

поместив курсор между кавычками.

Спасибо.


person beardc    schedule 21.10.2010    source источник
comment
Раньше я использовал такой макрос, но сегодня я использую так много разных редакторов (emacs, vs, eclipse, pn), что не мог полагаться на такую ​​возможность. Вместо этого я усвоил это поведение и едва могу ввести левый символ без рефлекторной вставки соответствующего сбалансированного символа. Непрограммисты, которые видят, как я это делаю, думают, что я странный.   -  person Zano    schedule 22.10.2010


Ответы (6)


Базовым вариантом будет AutoPairs. Тот же эффект, но немного более сложный, может быть достигнут с помощью YASnippet.

person Jacob Oscarson    schedule 21.10.2010
comment
Казалось, что AutoPairs и Paredit — два популярных предложения, но похоже, что AutoPairs создан для хорошей интеграции с YASnippet, что хорошо для дальнейшего завершения кода. - person beardc; 23.10.2010

Если вы наберете M-(, это вставит как (, так и a) и оставит точку между ними; если вы затем наберете M-), это переместит точку через закрывающую ). Я использую это все время.

Существует также режим под названием «paredit» (доступен по адресу http://mumble.net/~campbell/emacs/paredit.el), который делает то же самое и с кавычками, и, возможно, с другими вещами.

person offby1    schedule 21.10.2010
comment
В моей конфигурации M-) привязан к move-past-close-and-reindent, т.е. открывает новую строку. Есть ли возможность просто пройти мимо закрывающей скобки без повторного отступа? - person phimuemue; 22.10.2010
comment
M-- C-M-u может делать то, что вы хотите. - person offby1; 24.10.2010

Режим Paredit по умолчанию вставляет соответствующие закрывающие элементы, поэтому при вводе вы увидите что-то вроде printf(), затем printf(""), а курсор будет помещен в кавычки.

person eGlyph    schedule 21.10.2010

Я использую код с http://cmarcelo.wordpress.com/2008/04/26/a-little-emacs-experiment/ для создания «электрических пар». Как я заметил в моем блоге, другие режимы имеют проблемы со строками в тройных кавычках Python. (особенность Python)

person matt harrison    schedule 21.10.2010

Мои 5 центов и здесь.

(setq skeleton-pair t)
(defvar skeletons-alist
  '((?\( . ?\))
    (?\" . ?\")
    (?[  . ?])
    (?{  . ?})
    (?$  . ?$)))

(global-set-key (kbd "(") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "[") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "\"") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "\'") 'skeleton-pair-insert-maybe)

Следующий совет позволит backspace удалить пары: a(|)b -> ab

(defadvice delete-backward-char (before delete-empty-pair activate)
  (if (eq (cdr (assq (char-before) skeletons-alist)) (char-after))
      (and (char-after) (delete-char 1))))

Следующий совет заставит backward-kill-word (для меня это M-backspace) удалить соответствующий пар, даже если он разделен другим текстом; очень кстати.

(defadvice backward-kill-word (around delete-pair activate)
  (if (eq (char-syntax (char-before)) ?\()
      (progn
 (backward-char 1)
 (save-excursion
   (forward-sexp 1)
   (delete-char -1))
 (forward-char 1)
 (append-next-kill)
 (kill-backward-chars 1))
    ad-do-it))

Однако я пытаюсь перейти на paredit.

person VitoshKa    schedule 22.10.2010
comment
Поскольку Autopairs, по-видимому, не удаляет пары автоматически, этот совет по удалению пар в обратном направлении выглядит отличным дополнением. - person beardc; 23.10.2010

Дополнительный режим autopair делает именно то, о чем вы просите.

person Bozhidar Batsov    schedule 22.10.2010