2010-06-15 44 views
5

Tôi đang đưa ra chế độ ErgoEmacs để thử xem tôi có thể sử dụng Emacs thoải mái hơn không. Một số keybindings của nó khá trực quan, nhưng trong nhiều trường hợp tôi không muốn thay thế hoàn toàn các giá trị mặc định.Gán nhiều nút bấm Emacs cho một lệnh duy nhất?

Ví dụ, trong bối cảnh cấu trúc phím tắt điều hướng của ErgoEmacs, M-h có ý nghĩa như một sự thay thế cho C-a - nhưng tôi muốn có thể sử dụng cả hai, không chỉ M-h. Tôi đã cố gắng sao chép các lệnh này một cách đơn giản:

;; Move to beginning/ending of line 
(defconst ergoemacs-move-beginning-of-line-key (kbd "C-a")) ; original 
(defconst ergoemacs-move-end-of-line-key   (kbd "C-e")) ; original 
(defconst ergoemacs-move-beginning-of-line-key (kbd "M-h")) ; ergoemacs 
(defconst ergoemacs-move-end-of-line-key   (kbd "M-H")) ; ergoemacs 

Nhưng Emacs chỉ ghi đè khóa đầu tiên thứ hai. Cách tốt nhất để giải quyết vấn đề này là gì?

Trả lời

3

Khi nó quay ra, ErgoEmacs sử dụng hai tệp để xác định keybinding. Một là tệp chính ergoemacs-mode.el và cách khác là bố cục bàn phím cụ thể mà bạn chọn (ví dụ: ergoemacs-layout-us.el). Tài liệu sau tạo ra một hằng số, cái mà trước đây sử dụng để tạo keybinding. Vì vậy, trong khi tôi nghĩ rằng tôi đã nhân đôi keybinding, tôi đã thực sự thay đổi hằng số mà sau đó được sử dụng cho mục đích đó.

Giải pháp:

Trong ergomacs-mode.el:

;; Move to beginning/ending of line 
(define-key ergoemacs-keymap ergoemacs-move-beginning-of-line-key 'move-beginning-of-line) 
(define-key ergoemacs-keymap ergoemacs-move-end-of-line-key 'move-end-of-line) 
(define-key ergoemacs-keymap ergoemacs-move-beginning-of-line-key2 'move-beginning-of-line) ; new 
(define-key ergoemacs-keymap ergoemacs-move-end-of-line-key2 'move-end-of-line) ; new 

Trong ergoemacs-layout-us.el:

;; Move to beginning/ending of line 
(defconst ergoemacs-move-beginning-of-line-key (kbd "M-h")) 
(defconst ergoemacs-move-end-of-line-key  (kbd "M-H")) 
(defconst ergoemacs-move-beginning-of-line-key2 (kbd "C-a")) ; new 
(defconst ergoemacs-move-end-of-line-key2  (kbd "C-e")) ; new 
2

Huh? Có một và chỉ một cách cho mỗi chức năng một số nguyên tắc vàng của ErgoEmacs? Bởi vì keybinding bình thường hoạt động chính xác theo cách ngược lại: bạn đặt tên cho một khóa tại một thời điểm và xác định nó nên làm gì. Nếu một chế độ định nghĩa một biến toàn cầu có nghĩa là "khóa mà end-of-line bị ràng buộc", thì tất nhiên chỉ có thể có một giá trị, nhưng với các lệnh ràng buộc bình thường, bạn có thể kết buộc cùng một hàm với nhiều kết hợp bạn thích. Trong thực tế, mọi keybinding Tôi đã từng nhìn thấy sử dụng nhìn hoặc như thế này

(global-set-key [(meta space)] 'just-one-space) 

hay như thế này

(add-hook 'c-mode-hook 'my-c-mode-hook) 
(defun my-c-mode-hook() 
    (define-key c-mode-map [(control c) b] 'c-insert-block)) 

nếu nó chỉ cho một chế độ cụ thể.

+0

Xin cảm ơn, Kilian - đó là đầu mối dẫn tôi đến câu trả lời. Hóa ra ErgoEmacs định nghĩa keybinding trong ergoemacs-mode.el theo một ánh xạ, được định nghĩa trong 'defconst' mà tôi đã dán ở trên. – Dan

4

Để lại bài trả lời từ ergo-emacs mailing list:

Xah Lee đã nói:

thật dễ dàng.
trong tệp ergoemacs-mode.el, có dòng này (tải "ergoemacs-unbind") chỉ nhận xét. Đó phải là tất cả bạn cần làm. Tuy nhiên, lưu ý rằng Phím tắt ErgoEmacs xác định các phím tắt phổ biến như Mở, Đóng, Mới, Lưu ... bằng các phím Ctrl + o, Ctrl + w, Ctrl + n, Ctrl + s vv Giới thiệu 7 trong số chúng hoặc là. Vì vậy, tôi nghĩ rằng một số trong số này sẽ nhấn vào emacs truyền thống ràng buộc với Ctrl. nếu bạn chưa quen với ErgoEmac và cố gắng khám phá nó, bạn có thể chỉ cần thử bắt đầu với một số phím .trang này có thể có một số thông tin hữu ích: http://code.google.com/p/ergoemacs/wiki/adoption cảm ơn vì đã kiểm tra ErgoEmacs!
Xah ∑ http://xahlee.org/

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