Emacs未绑定的按键绑定

3

我该如何清除一个绑定或编辑一个emacs包提供的绑定?

比如说,我之前使用M-c来使单词首字母大写。
但是在安装了某个第三方emacs包之后,它被更改成了calc-dispatch。

我想要像之前一样使用M-c来使单词首字母大写,并将calc-dispatch设置为其他操作。

要如何实现这一点呢?

2个回答

2
关键绑定映射按顺序加载。后加载的关键绑定映射具有更高的优先级。这就是为什么本地关键映射将覆盖全局关键映射的原因,因为全局关键映射在本地关键映射(模式关键映射)之前加载。这里有些问题,请查看phils的评论。
我解决这个问题的方法是添加一个钩子来禁用该关键绑定并将其重新绑定到该关键映射中的其他键。 首先,您需要找到将M-c绑定到calc-dispatch的按键映射名称。通常它是模式名称模式映射的组合。
例如,python模式键映射的名称是py-mode-map第二,在该模式中删除M-c绑定,并使用钩子将其重新绑定到其他键。
例如,在python模式中,我想删除绑定C-j (py-newline-and-indent)。并将它重新绑定到C-i。因为全局上我将C-j绑定到linum-ace-jump。这与您的情况类似。
(add-hook 'python-mode-hook 
          #'(lambda () 
              (define-key py-mode-map "\C-j" nil)
              (define-key py-mode-map "\C-i" 'py-newline-and-indent)))

1
我不认为那完全准确?当然,加载顺序会影响次要模式键映射的优先级(因为它决定了minor-mode-map-alist的顺序,如果没有其他方式进行操作),但我的理解是全局键映射被明确地最后搜索,而不仅仅是由于加载顺序的副作用。请参见C-h i g (elisp) Searching Keymaps - phils

1
您所要求的是:
(global-set-key (kbd "M-c") 'capitalize-word)

这通常是全局设置单词的方式。

如果您想替换这两个单词,可以尝试这样做:

(substitute-key-definition
           'capitalize-word 'calc-dispatch (current-global-map))



(define-key KEYMAPNAME (kbd "KEYCOMBO") 'FUNCNAME)

这是针对特定模式的。例如:(define-key emacs-lisp-mode (kbd "M-c) 'capitalize-word)。

(global-set-key (kbd "M-c") nil)

通常是解除一个键的绑定(全局)。

您可以通过谷歌搜索轻松找到更多相关信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接