将多个Emacs键绑定分配给单个命令?

时间:2010-06-15 19:07:41

标签: emacs keyboard keyboard-shortcuts key-bindings

我正在尝试ErgoEmacs模式,看看我是否可以更舒适地使用Emacs。它的一些键绑定非常直观,但在很多情况下我不想直接替换默认值。

例如,在ErgoEmacs的导航快捷键结构的上下文中,M-h作为C-a的替代品是有意义的 - 但我希望能够同时使用两者,而不仅仅是M-h。我试过简单地复制命令:

;; 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

但是Emacs只是用第二个键覆盖了第一个键绑定。解决这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:4)

重新发布ergo-emacs mailing list的回复:

Xah Lee说:

  

这很容易。
  在里面   ergoemacs-mode.el文件,就是这个   line(加载“ergoemacs-unbind”)就好了   评论出来。这应该是全部   你需要做的。但请注意   ErgoEmacs键绑定定义了这些   常见的快捷方式,如Open,Close,   新建,保存...按键Ctrl + o,   Ctrl + w,Ctrl + n,Ctrl + s等。大约7个   他们左右。所以,我想其中一些   将会传播emacs传统   用Ctrl绑定。如果你是新手   ErgoEmacs并尝试探索它,   你可能只想尝试一下   键。这个页面可能有一些   有用信息:   http://code.google.com/p/ergoemacs/wiki/adoption   感谢您查看ErgoEmacs!
  XahΣhttp://xahlee.org/

答案 1 :(得分:3)

事实证明,ErgoEmacs使用两个文件来定义键绑定。一个是主要的 ergoemacs-mode.el 文件,另一个是您选择的特定键盘布局(例如 ergoemacs-layout-us.el )。后一个文档创建一个常量,前者用它来创建键绑定。因此,虽然我认为我正在重复键绑定,但实际上我正在更改随后用于此目的的常量。

解决方案:

在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

在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 :(得分:2)

咦?每个功能都有一种且唯一的方式是ErgoEmacs的一些黄金原则吗?因为正常的键绑定完全相反:您一次命名一个键并指定它应该做什么。如果模式将全局变量定义为“行末尾绑定的键”,那么当然只能有一个值,但是使用普通绑定命令可以将相同的函数绑定到尽可能多的组合。你喜欢。事实上,我见过的每个键绑定看起来都像这样

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

或者像这样

(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))

如果仅适用于特定模式。