Emacs解除某个模式的按键绑定

10
我创建了一个自定义的按键绑定宏,如下所示:
```(global-set-key (kbd "C-C C-c") "\C-a\C- \C-n\M-w\C-y")```
问题在于,在 `python-mode` 中, `C-c C-c` 已被定义为 `python-send-buffer`。因此,我的宏适用于除 python-mode 之外的所有模式。我假设 `python-mode` 是在我的初始化文件之后评估的,因此它覆盖了该按键绑定。
我尝试使用 `(eval-after-load "python-mode")` 和 `global-unset-key` 取消 `C-c C-c`,但这并不起作用。在 python 中, `C-c C-c` 总是映射到 `python-send-buffer`。
如何完全禁用 Python 的 `C-c C-c`,并使用我的宏替代呢?
我正在使用 Emacs 24.2.1。

C-c C-c在许多模式下都有定义。也许你应该考虑https://dev59.com/nHRB5IYBdhLWcg3wN1EQ - scottfrazer
1
或者考虑使用不同的键。 C-c 后跟控制键(例如 C-c)被“保留用于主模式”,这意味着定义主模式的 Lisp 代码有权使用它(并且他们经常使用 C-c C-c,如 ScottFrazer 所说)。当然,用户仍然有权绑定这样的键,但要知道主模式也会自由地这样做,因此您可能需要找到替代键来在这些模式下使用(请参见此处的答案)。请参阅 Elisp 手册,节点“键绑定约定”。 - Drew
@Drew,我似乎找不到一个方便易用/有意义的C-x绑定来执行我经常使用的复制和粘贴操作。 - darksky
这个问题不是https://dev59.com/-mYr5IYBdhLWcg3wFGVS的重复,因为那里的答案并没有建议使用`add-hook`,但是OP表示他们使用了`add-hook`,但它没有起作用。将此问题标记为该问题的重复会产生误导。那个问题的答案在我的情况下不起作用,这就是我发布这个问题的原因。 - darksky
@Darsky:那么就不要使用前缀C-x。你还有很多可用的键。请参阅手册中的“键绑定约定”,了解哪些键保留给用户。(您也可以绑定任何其他键,但它们可能会覆盖模式键等)。您还可以定义自己的前缀键:例如,您可以将<f8>作为一些或所有自己的键的前缀。 - Drew
2个回答

11
(add-hook 'python-mode-hook
          (lambda()
            (local-unset-key (kbd "C-c C-c"))))

3
这应该可以做到:
(add-hook 'python-mode-hook
          (lambda()
            (define-key python-mode-map (kbd "C-c C-c") nil)))

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