2011-10-10 2 views
4

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

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

Как настроить emacs, чтобы игнорировать дополнительный ключ?

ответ

8

Хотя это удовольствие свернуть свой собственный, autopair стала в каноническое решение этой проблемы. Он делает все, что вы просите, и несколько вещей, которые вы не знали, что хотите. Emacs wiki entry.

Emacs 24 (в настоящее время в предварительном порядке) будет упакован с пакетом электрической пары. Автопарк по-прежнему гораздо сложнее, чем встроенный.

+0

Очень хорошо. Мой ответ пришел с той же страницы вики, с которой вы связались, но я не могу вспомнить *, когда * я на самом деле зачерпнул код. Из быстрого теста, похоже, что autopairs.el работает так же хорошо и предлагает больше возможностей одновременно. Благодаря! – Tyler

+0

Как долгое время пользователь autopair.el, могу сказать вам, что встроенная поддержка электрических пар в Emacs 24 вряд ли уступает. –

+0

Может быть, мне не хватает, но обратная связь «(|)» здесь не удаляет пару, которую делает автопилот. Также у автопарка есть крючки для изменения поведения спаривания. Например, у меня есть функция, которая накладывает скобки с пробелами для кода Ruby, и есть еще одна функция, которая обрабатывает тройные кавычки для Python. –

2

EDIT: У меня было какое-то время в моем .emacs некоторое время, и он работал нормально, поэтому я не слишком много думал об этом. Как отмечает event_jr в его ответе, те же функции (и, видимо, немного больше) могут быть получены с пакетом autopairs.el, связанным с той же страницы, на которой я получил этот код.

У меня есть следующий код в моем .emacs, чтобы сделать это, взятое из the emacs wiki:

(setq skeleton-pair t) 

(setq skeleton-pair-alist 
     '((?\(_ ?\)) 
    (?[ _ ?]) 
    (?{ _ ?}) 
    (?\" _ ?\"))) 

(defun autopair-insert (arg) 
    (interactive "P") 
    (let (pair) 
    (cond 
    ((assq last-command-char skeleton-pair-alist) 
     (autopair-open arg)) 
    (t 
     (autopair-close arg))))) 

(defun autopair-open (arg) 
    (interactive "P") 
    (let ((pair (assq last-command-char 
      skeleton-pair-alist))) 
    (cond 
    ((and (not mark-active) 
     (eq (car pair) (car (last pair))) 
     (eq (car pair) (char-after))) 
     (autopair-close arg)) 
    (t 
     (skeleton-pair-insert-maybe arg))))) 

(defun autopair-close (arg) 
    (interactive "P") 
    (cond 
    (mark-active 
    (let (pair open) 
     (dolist (pair skeleton-pair-alist) 
    (when (eq last-command-char (car (last pair))) 
     (setq open (car pair)))) 
     (setq last-command-char open) 
     (skeleton-pair-insert-maybe arg))) 
    ((looking-at 
    (concat "[ \t\n]*" 
     (regexp-quote (string last-command-char)))) 
    (replace-match (string last-command-char)) 
    (indent-according-to-mode)) 
    (t 
    (self-insert-command (prefix-numeric-value arg)) 
    (indent-according-to-mode)))) 

(defun autopair-backspace (arg) 
    (interactive "p") 
    (if (eq (char-after) 
     (car (last (assq (char-before) skeleton-pair-alist)))) 
     (and (char-after) (delete-char 1))) 
    (delete-backward-char arg)) 

(global-set-key [backspace] 'autopair-backspace) 
(define-key isearch-mode-map [backspace] 'isearch-delete-char) ;; required to fix behaviour in isearch 

(global-set-key "(" 'autopair-insert) 
(global-set-key ")" 'autopair-insert) 
(global-set-key "[" 'autopair-insert) 
(global-set-key "]" 'autopair-insert) 
(global-set-key "{" 'autopair-insert) 
(global-set-key "}" 'autopair-insert) 
(global-set-key "\"" 'autopair-insert) 
1

Я не уверен, что это только функция Emacs 24, но electric-pair-mode, похоже, делает то, что вы хотите.

+0

Я уже тестировал аутоп, и он работает, но я проверю это, когда у меня будет свободное время на руках. Благодаря! – vise

Смежные вопросы