2011-10-10 68 views
4

在我使用的一些模式中,emacs通過自動關閉某些元素(如引號,括號)來幫助我。智能自動關閉匹配字符

不過有時候,出於習慣,我輸入我自己的結束元素,最後輸入())"""

如何設置emacs忽略多餘的密鑰?

回答

8

採取雖然很好玩推出自己的,autopair已成爲規範解決了這個問題。它能完成你所要求的一切,以及一些你不知道你想要的東西。 Emacs wiki entry

Emacs 24(目前在預測試中)將預先包裝成電動配對包。 Autopair比內置的還要複雜得多。

+0

非常好。我的回答來自您鏈接到的同一個wiki頁面,但我不記得*何時*我實際上已經獲取了代碼。從快速測試看,它看起來像autopairs.el一樣好,同時提供更多功能。謝謝! – Tyler

+0

作爲autopair.el的長期用戶,我可以告訴你,Emacs 24內置的電氣配對支持並不差。 –

+0

也許我錯過了,但是退格「(|)」在這裏並沒有刪除這對autopair。 autopair也有掛鉤來修改配對行爲。例如,我有一個爲大寫代碼填充大括號的函數,另外還有一個函數可以處理Python的三重引號。 –

2

編輯:我在我的.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

我已經測試過autopair,它的工作原理,但我會檢查這一點,當我有一些空閒時間在我手上。謝謝! – vise