2010-03-22 43 views
9

Tôi có chế độ phụ. Nếu chế độ đó đang hoạt động và người dùng nhấn DEL, tôi muốn thực hiện một số hành động, nhưng chỉ khi một số điều kiện được giữ. Nếu các điều kiện giữ và hành động được thực thi, tôi không muốn làm gì thêm sau đó. Nhưng nếu điều kiện không thành công, tôi không muốn làm bất cứ điều gì và để cho hành động DEL mặc định thực thi.Dự phòng ràng buộc khóa Emacs

Không chắc chắn cách tôi có thể giải quyết vấn đề này. Nhưng tôi đoán tôi có thể làm điều đó trong hai cách:

1) tôi có thể rebind phím DEL để một chức năng ở chế độ nhẹ và sau đó kiểm tra nếu các điều kiện giữ ot không. Nhưng sau đó làm thế nào để tôi biết lệnh mặc định cho DEL là gì?

2) Tôi có thể thêm móc lệnh trước như thế này. Thực hiện lệnh và sau đó phá vỡ chuỗi. Nhưng làm thế nào để phá vỡ chuỗi?

(add-hook 'pre-command-hook 
      (lambda() 
      (when (equal last-input-event 'backspace) 
       ;; Do something and then stop (do not execute the 
       ;; command that backspace is bound to) 
      ))) 

Bạn sẽ giải quyết nó theo cách nào? Cảm ơn!

+0

Có phải del và backspace giống nhau không? – Amos

Trả lời

12

Cách để thực hiện việc này là tạm thời vô hiệu hóa chế độ phụ của bạn, sau đó tra cứu ràng buộc khóa.

Giả vờ rằng bạn đã bị ràng buộc 'do-thingy-DEL. Sau đó, điều này sẽ làm các trick (giả sử điều kiện bạn muốn kích hoạt tắt là (equal last-input-event 'backspace):

(defun do-thingy() 
    "Do something, unless last event was backspace." 
    (interactive) 
    (if (equal last-input-event 'backspace) 
     (let* ((my-minor-mode nil) 
      (original-func (key-binding (kbd "DEL")))) 
     ;; original-func is whatever DEL would be if 
     ;; my-minor-mode were disabled 
     (call-interactively original-func)) 
    (message "Here's my minor mode behavior!"))) 

Lưu ý: Hành vi này giả sử bạn đã thiết lập key bindings của bạn standard way a minor-mode would Cụ thể, bạn nên thêm sơ đồ bàn phím của bạn để biến minor-mode-map-alist. Bằng cách thêm một phần tử (my-minor-mode . my-minor-mode-keymap). Đó là cách hoạt động của câu lệnh trên let, có vẻ như ràng buộc mà bạn muốn với chế độ của mình tạm thời bị vô hiệu hóa. "tự động.

+0

Hoàn hảo, cảm ơn! – rejeep

+2

Còn về dự phòng tùy ý, nơi bạn không biết trước khóa nào có ràng buộc bạn muốn quay trở lại? Làm thế nào bạn có thể lập trình tra cứu ràng buộc để sử dụng cho giá trị của func gốc? (nevermind: có vẻ như người ta sử dụng lệnh này-lệnh-keys-vector). –

-3

Dường như không phải là cách để làm những gì bạn muốn một cách đáng tin cậy. Nếu lệnh mới của bạn bị ràng buộc với DEL, thì mọi thứ đã bị ràng buộc với DEL trước đó trong sơ đồ bàn phím hiện tại không còn nữa. Cách tiếp cận khác mà bạn đề xuất sẽ không hoạt động bởi vì các lệnh trước-móc không ngăn cản hành động sau đây xảy ra. Bạn cũng có thể nghĩ rằng để làm gián đoạn việc thực hiện thêm với^G (Bàn phím-Quit), nhưng đó là một gián đoạn không kiểm soát được có thể ngăn chặn nhiều thứ hơn bạn muốn.

Thậm chí nếu bạn thực hiện quá trình thiết lập ràng buộc mới phức tạp hơn là chỉ liên kết lại và nhớ những gì đã bị ràng buộc ở đó, bạn có thể gọi nó sau đó, bạn thực sự không có gì cho. Nếu ai đó muốn rebind hành động "mặc định", họ phải làm điều đó bằng cách thay đổi chức năng của bạn thay vì thay thế ràng buộc khóa.

Những gì bạn muốn làm không phù hợp với mô hình của Emacs về cách hoạt động của tính năng ràng buộc khóa.

2

Đây là những gì tôi sử dụng cho gói smart-tab của mình thực hiện chính xác điều đó.

(defun smart-tab-default() 
    "Indents region if mark is active, or current line otherwise." 
    (interactive) 
    (if mark-active 
     (indent-region (region-beginning) 
        (region-end)) 

    (call-interactively 
    (or 
     ;; Minor mode maps for tab (without smart-tab-mode) 
     (cdar (assq-delete-all 'smart-tab-mode (minor-mode-key-binding "\t"))) 
     (cdar (assq-delete-all 'smart-tab-mode (minor-mode-key-binding [(tab)]))) 
     (local-key-binding "\t") 
     (local-key-binding [(tab)]) 
     (global-key-binding "\t") 
     (global-key-binding [(tab)]))))) 

Và trong lệnh smart-tab (đó là một trong những ràng buộc để tab ở chế độ nhỏ ), nó có những điều sau đây:

(if (smart-tab-must-expand prefix) 
    ;; use smart tab 
    (smart-tab-default)) 

Nó kiểm tra đầu tiên nếu có bất kỳ ràng buộc chế độ nhỏ cho tab (không bao gồm smart-tab-mode), sau đó là cục bộ và cuối cùng là các khóa chung trên toàn cầu.

Các vấn đề liên quan