2012-10-27 31 views
14

Tôi muốn sử dụng chế độ phụ giúp khôi phục khóa chế độ chính mà tôi chắc chắn muốn giữ. Làm cách nào để tôi có thể khôi phục khóa mà không xóa nó khỏi bản đồ chế độ phụ trên toàn cầu? Tôi biết tôi có thể sử dụng define-key cho điều đó, nhưng tôi muốn giữ cho ràng buộc cho các bộ đệm khác/chế độ chính.Ràng buộc khóa ở chế độ phụ đệm cục bộ trong Emacs

Có ai giúp được không?

Trả lời

12

Đó là một chút cồng kềnh để làm. Bạn có thể làm điều gì đó như:

(add-hook '<major-mode>-hook 
    (lambda() 
    (let ((oldmap (cdr (assoc '<minor-mode> minor-mode-map-alist))) 
      (newmap (make-sparse-keymap))) 
     (set-keymap-parent newmap oldmap) 
     (define-key newmap [<thekeyIwanttohide>] nil) 
     (make-local-variable 'minor-mode-overriding-map-alist) 
     (push `(<minor-mode> . ,newmap) minor-mode-overriding-map-alist)))) 
+0

Tuyệt vời, công việc mà! Tôi ngạc nhiên rằng nhiệm vụ dường như đơn giản này rất cồng kềnh ... – sebhofer

+0

sebhofer: Toàn bộ ý định của các bản đồ khóa cụ thể theo chế độ là chúng * làm * có hiệu lực ở mọi nơi chế độ hoạt động, vì vậy tôi sẽ không gọi nhiệm vụ phá vỡ hành vi đó "dường như đơn giản". Với những trường hợp đó, giải pháp này trông khá thanh lịch. – phils

+0

@phils Tốt từ một điểm ngây thơ chút của nhiệm vụ là: Ghi đè một keybinding trong một bộ đệm nhất định. Có vẻ dễ đối với tôi. – sebhofer

11

Đây là chức năng xử lý tất cả các bit cồng kềnh.

(defun local-set-minor-mode-key (mode key def) 
    "Overrides a minor mode keybinding for the local 
    buffer, by creating or altering keymaps stored in buffer-local 
    `minor-mode-overriding-map-alist'." 
    (let* ((oldmap (cdr (assoc mode minor-mode-map-alist))) 
     (newmap (or (cdr (assoc mode minor-mode-overriding-map-alist)) 
        (let ((map (make-sparse-keymap))) 
         (set-keymap-parent map oldmap) 
         (push `(,mode . ,map) minor-mode-overriding-map-alist) 
         map)))) 
    (define-key newmap key def))) 

Sau đó bạn có thể làm

(local-set-minor-mode-key '<minor-mode> (kbd "key-to-hide") nil) 
+0

Cảm ơn rất nhiều, hoạt động như mong đợi! – sebhofer

1

Trong trường hợp của tôi, company-mode được trọng các cider-repl-mode bindings cho M-pM-n Công ty khi hoành thành đơn đã được hiển thị. Sơ đồ bàn phím cho menu hoàn thành là company-active-map, nhưng không có chế độ phụ tương ứng với nó (company-mode là khi menu là không hoạt động), vì vậy tôi không thể sử dụng bất kỳ câu trả lời hiện có nào.

Đây là những gì tôi đã đưa ra thay vì:

(add-hook 'cider-repl-mode-hook 
      (lambda() 
      (make-local-variable 'company-active-map) 
      (setq company-active-map (copy-tree company-active-map)) 
      (define-key company-active-map (kbd "M-p") nil) 
      (define-key company-active-map (kbd "M-n") nil))) 
Các vấn đề liên quan