我想为适合任何程序模式的改进定义自定义模式。我需要为所有这些模式定义键绑定。我选择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
调用中。
如果我对两张地图使用了相同的键定义,怎么可能呢?我错过了哪些细节?
答案 0 :(得分:3)
只需使用make-sparse-keymap
正常创建一个键盘映射,并将其命名为my-mode-map
---就完成了。无需:keymap
arg到define-minor-mode
。
或者,如果您愿意,可以使用make-sparse-keymap
创建的键盘映射作为:keymap
的值。 (但不需要,因为它被命名为次要模式期望:my-mode-map
。)
但为什么不通过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-;
绑定?