2

我想为适合任何程序模式的改进定义自定义模式。我需要为所有这些模式定义键绑定。我选择使用define-minor-modewith: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调用中出现。

如果我对两张地图都使用了相同的键定义,那怎么可能呢?我错过了哪些细节?

4

2 回答 2

3
  1. 只需正常创建一个键盘映射,使用make-sparse-keymap并命名它my-mode-map--- 你就完成了。不需要:keymaparg 到define-minor-mode.

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

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

于 2013-10-11T02:06:23.690 回答
3

不要使用幻数。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-;绑定?

于 2013-10-11T02:35:24.447 回答