2013-10-17 23 views
1

有一個emacs擴展可以將密鑰構建到非常不方便的位置,並且在加載擴展後在我的.emacs文件中重新分配鍵綁定。我窺見了擴展代碼,它沒有使用可能在加載前傳遞的變量或defcustoms。undefine空的前綴鍵遞歸

我首先禁用與(define-key ... nil)的現有綁定,然後重新綁定它們。

問題是,所有的前綴綁定鏈仍然存在並污染我的鍵盤設置。

如何以遞歸方式刪除所有空的(沒有註冊的子項)前綴密鑰?


與例如

更新假設map是一個空的稀疏鍵映射。

(define-key map (kbd "C-c M-p b") 'do-first) 
(define-key map (kbd "C-c M-p b f g") 'do-second) 
(define-key map (kbd "C-c M-p b r s") 'do-third) 
(define-key map (kbd "C-c M-p b r s") nil) 
(define-key map (kbd "C-c M-p b f g") nil) 
(define-key map (kbd "C-c M-p b") nil) 

之後,我想使用某種功能像(clean-map map)使map空一次。

+0

能否請您提供一個更具體的例子,以更好地說明問題?例如,顯示一些代碼。 – Drew

+0

我認爲問題是如果'Cc b'最初沒有被定義,它將在以下之後保持爲「空前綴」:'(global-set-key(kbd「Cc ba」)'func)(global- unset-key(kbd「Cc ba」))'。 ayvango希望以遞歸的方式刪除所有這樣的空白前綴(這樣,只有其他前綴作爲後代的前綴也將被刪除)。 – phils

+0

哪個分機導致問題?如果它在ELPA或其他常見回購站點中可用,或者我可以在某處獲取源代碼,那麼我會在emacs -q會話中加載它,然後使用它來查看是否可以提供解決方案。 –

回答

1

不幸的是,沒有簡單的解決方案。

(defun eab/delete-sublist (sublst lst) 
    (read (replace-regexp-in-string 
    (prin1-to-string sublst) 
    "" 
    (prin1-to-string lst)))) 

(defun clean-map (target-map) 
    (let ((map target-map)) 
    (cl-flet ((clean-keymaps 
     (event def) 
     (if (keymapp def) 
     (if (keymap-emptyp def) 
      (progn 
       (setq map 
       (eab/delete-sublist (cons event def) map)) 
       (map-keymap 'clean-keymaps map)) 
      (map-keymap 'clean-keymaps def))))) 
     (map-keymap 'clean-keymaps map) 
     map))) 

(defun keymap-emptyp (keymap) 
    (if (keymapp keymap) 
     (if (or (and 
      (eq 2 (length keymap)) 
      (not (cdr (cadr keymap)))) 
      (equal keymap '(keymap))) 
     't 
    nil) 
    nil)) 

(keymap-emptyp '(keymap (110))) => t 
(keymap-emptyp '(keymap)) => t 
(keymap-emptyp '(keymap (110) (103 . do-second))) => nil 

(setq test-map (make-sparse-keymap)) 

(define-key test-map (kbd "C-c M-p b f k") 'do-first) 
(define-key test-map (kbd "C-c M-p b f g") 'do-second) 
(define-key test-map (kbd "C-c M-p b r s n") 'do-third) 
(define-key test-map (kbd "C-c M-p b r s n") nil) 

之前:有兩個遞歸前綴綁定「r」和「r s」。

抄送熔點BF prefix命令

抄送熔點BR prefix命令

抄送熔點BRS prefix命令

抄送熔點BFG做,第二

抄送熔點BFK做一

(setq test-map (clean-map test-map)) 

之後:清洗完畢。

C-C M-P b˚Fprefix命令

C-C M-P b F G做,第二

C-C M-P b˚Fk執行一

0

如果@phils了你的權利,並利用他的例子,你可以這樣做:

(global-set-key (kbd "C-c b") nil) 

這樣的空前綴被清除。