如何正确定义次模式的键映射

时间:2013-10-11 00:29:08

标签: emacs elisp minor-mode

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

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

2 个答案:

答案 0 :(得分:3)

  1. 只需使用make-sparse-keymap正常创建一个键盘映射,并将其命名为my-mode-map ---就完成了。无需:keymap arg到define-minor-mode

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

  3. 但为什么不通过global-set-key使用全局绑定?为什么你甚至需要这个是小模式绑定?

答案 1 :(得分: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-;绑定?