Автоматическое закрытие брекетов в Emacs?
Я видел плагин для Vim, который называется AutoClose (обнаружено this post), который автоматически добавляет замыкающую фигуру при наборе '(', '{' и т.д.
Например; когда я набираю следующее (|
- это курсор):
int main(|
Я бы хотел, чтобы закрытие )
было вставлено автоматически для меня:
int main(|)
Кто-нибудь знает о подобной функции для emacs - на этот раз Google не помог мне!
Ответы
Ответ 1
Там также 'paredit
. В чит-лист показаны все доступные команды. похоже, лучше, чем электрический режим, предложенный в другом ответе. Хотя paredit применим только к(), поэтому он может не соответствовать вашим потребностям.
Но, честно говоря, есть куча пакетов, связанных с круглыми скобками. В вики есть все перечисленные здесь. Режимы, касающиеся вашего вопроса:
Ответ 2
да, этот режим называется электрическим. Вы можете комбинировать электрическое поведение с этим простым макросом для максимального удобства:
(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!
Другие режимы могут обеспечить что-то подобное.
Ответ 3
cmarcelo написал замечательный пост об этом, используя режим скелета. Он также показывает, как удалить сбалансированный кронштейн, если вы удалите открывающий кронштейн и как справиться со случаем, когда вы случайно набираете закрывающий кронштейн. (Кстати, оба поведения копируют TextMate).
Update:
Поскольку я отправил этот ответ, я обнаружил Autopair, который является довольно совершенной системой для этого варианта использования. Я много использую и люблю его.
Ответ 4
Я собираюсь некротировать эту тему и предоставить другую альтернативу. Недавно был запущен новый проект, посвященный автоматической вставке пар, упаковке регионов, навигации по сбалансированным выражениям и многим другим. Список функций слишком длинный, чтобы дать здесь, поэтому я просто свяжусь с smartparens github repo, где вы сможете прочитать подробное чтение.
Это надмножество вышеупомянутого AutoPair и обеспечивает большинство основных функций paredit (и распространяется на все виды разных пар, а не только те, которые распознаются синтаксическими таблицами emacs).