Emacs 怎么让按键绑定覆盖其他所有mode?

我定义了一个major mode,想在major mode里把C-c绑定到一个命令上,但是不成功,有可能是哪里的问题?

Major mode:

(define-derived-mode yterm-command-mode
  shell-script-mode "yTerm"
  "Major mode for entering commands in yterm command buffer."
  :group 'yterm
  (yterm--format-command-buffer)
  (yterm--setup-command-mode-key))

绑定 C-c:

(defun yterm--setup-command-mode-key ()
  "Setup keybindings for yterm-command-mode."
  (add-to-list 'emulation-mode-map-alists `((yterm-command-mode . ,yterm-command-mode-map)))
  (define-key yterm-command-mode-map (kbd "C-c") #'yterm-command-send-eof))

Major mode里按C-c的效果:


我又试着绑定了其他的按键,依然不成功,是不是什么其他的minor mode覆盖了我的绑定?怎么才能让我的绑定覆盖其他所有的mode?

如果一个按键成为了一个 map (即任意开头为 C-c 的多段按键),那么之后的直接按键设置就会被忽略。所以你得手动找出并 undefine 所有该 mode 中以及 global mode 和相关 minor mode 中 C-c 开头的键。如果这些是 lazy load 的话,还要考虑加载次序。

或者用 key-translation-map,然而这样就只能全局开了。(即 CUA-mode 的做法)

也就是说,想直接用 C-c 只能折腾自己。

2 个赞

general override mode 应该可以 GitHub - noctuid/general.el: More convenient key definitions in emacs

看了一下用的是bind-key.el,很好用,谢了 :smile: