Подтвердить что ты не робот

Автоматическое закрытие брекетов в Emacs?

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

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

int main(|

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

int main(|)

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

4b9b3361

Ответ 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).