Интеллектуальное автоматическое закрытие совпадающих символов - PullRequest
4 голосов
/ 11 октября 2011

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

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

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

Ответы [ 3 ]

8 голосов
/ 11 октября 2011

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

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

2 голосов
/ 11 октября 2011

РЕДАКТИРОВАТЬ: У меня было некоторое время в моем .emacs, и это работало нормально, поэтому я не слишком много думал об этом.Как указывает event_jr в своем ответе, те же функции (и, очевидно, немного больше) можно получить с пакетом autopairs.el, связанным с той же страницей, с которой я получил этот код.

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

(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 голос
/ 11 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...