【问题标题】:Assign multiple Emacs keybindings to a single command?将多个 Emacs 键绑定分配给单个命令?
【发布时间】:2011-03-04 03:46:21
【问题描述】:

我正在尝试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 只是用第二个键绑定覆盖了第一个键绑定。解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: emacs keyboard keyboard-shortcuts key-bindings


    【解决方案1】:

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

    Xah Lee 说:

    这很容易。
    在里面 ergoemacs-mode.el 文件,有这个 行(加载“ergoemacs-unbind”)只是 注释掉。应该就是这样 你需要做。但是,请注意 ErgoEmacs 键绑定定义了那些 常用快捷方式,例如打开、关闭、 新建,保存... 使用 Ctrl+o 键, Ctrl+w、Ctrl+n、Ctrl+s 等。大约 7 个 他们左右。所以,我认为其中一些 将打击传统的emacs 与 Ctrl 绑定。如果你不熟悉 ErgoEmacs 并试图探索它, 你可以试着从几个开始 键。这个页面可能有一些 有用的信息: http://code.google.com/p/ergoemacs/wiki/adoption 感谢您查看 ErgoEmacs!
    哈∑http://xahlee.org/

    【讨论】:

      【解决方案2】:

      事实证明,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
      

      【讨论】:

        【解决方案3】:

        嗯? 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))
        

        如果它仅适用于特定模式。

        【讨论】:

        • 谢谢,Kilian——这是引导我找到答案的线索。结果 ErgoEmacs 根据映射定义了 ergoemacs-mode.el 中的键绑定,该映射在我上面粘贴的“defconst”中定义。
        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 2017-09-14
        相关资源
        最近更新 更多