【问题标题】:How to define keymap for minor mode correctly如何正确定义次要模式的键盘映射
【发布时间】:2013-10-11 00:29:07
【问题描述】:

我想为适合任何程序模式的改进定义自定义模式。我需要为所有这些模式定义键绑定。我选择使用define-minor-mode:keymap 以最小的努力声明键绑定。

我想将comment-or-uncomment-region 绑定到"C-;" kbd 宏给了我[67108923] 这个键序列的幻数。

我写的示例不起作用

(define-minor-mode
  my-mode
  nil nil
 :keymap '(
   ( [67108923] . comment-or-uncomment-region )
  )
)

我已注册模式,将其打开,但按下 С-; 会产生未定义键序列的通知

之后,我在暂存缓冲区中写入并评估了以预期方式执行的简单 global-set-key

(global-set-key [67108923] 'comment-or-uncomment-region )

现在按下C-; 会产生预期的comment-or-oncomment-region 行为。

我尝试通过C-h f 搜索功能信息来调试问题。它会产生奇怪的输出,comment-or-oncomment-region两次 绑定到 不同的 键序列:

It is bound to C - ;, C-;

第一个出现并随着次要模式切换而消失,另一个出现在 global-set-key 调用中。

如果我对两张地图使用了相同的键定义,怎么会这样?我遗漏了哪些细节?

【问题讨论】:

    标签: emacs elisp minor-mode


    【解决方案1】:
    1. 只需正常创建一个键盘映射,使用make-sparse-keymap,并将其命名为my-mode-map --- 大功告成。不需要:keymap arg 到define-minor-mode

    2. 如果您愿意,也可以使用您使用make-sparse-keymap 创建的键映射作为:keymap 的值。 (但没必要,因为它被命名为次要模式所期望的:my-mode-map。)

    3. 但是为什么不直接使用全局绑定,通过global-set-key?为什么您甚至需要将其作为次要模式绑定?

    【讨论】:

    • make-sparse-keymap 完美运行,但我仍然不明白基于gnu.org/software/emacs/manual/html_node/elisp/… 的原始方法有什么问题
    • ayvango:您的代码在 Emacs 24.3 中工作。我怀疑您的问题是您最初弄错了,之后定义了my-mode-map。任何后续评估都不会破坏现有地图;您需要先取消绑定my-mode-map
    【解决方案2】:

    不要使用幻数。 IOW 使用[?\C-\;],所以它可以被人类理解。 我同意德鲁:

    (defvar my-mode-map
      (let ((map (make-sparse-keymap)))
        (define-key map [?\C-\;] 'comment-or-uncomment-region)
        map))
    
    (define-minor-mode my-mode
      "blabla"
      nil nil nil
      <add code, if any>)
    

    哦,还有一件事:为什么您更喜欢 C-; 而不是标准的 M-; 绑定?

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多