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)
Очень хорошо. Мой ответ пришел с той же страницы вики, с которой вы связались, но я не могу вспомнить *, когда * я на самом деле зачерпнул код. Из быстрого теста, похоже, что autopairs.el работает так же хорошо и предлагает больше возможностей одновременно. Благодаря! – Tyler
Как долгое время пользователь autopair.el, могу сказать вам, что встроенная поддержка электрических пар в Emacs 24 вряд ли уступает. –
Может быть, мне не хватает, но обратная связь «(|)» здесь не удаляет пару, которую делает автопилот. Также у автопарка есть крючки для изменения поведения спаривания. Например, у меня есть функция, которая накладывает скобки с пробелами для кода Ruby, и есть еще одна функция, которая обрабатывает тройные кавычки для Python. –