如何设置全局覆盖的键绑定,并优先于该键的所有其他绑定?我想覆盖所有主要/次要模式映射,并确保我的绑定始终有效.
这当然不起作用:
(global-set-key "\C-i" 'some-function)
它起作用text-mode
,但是当我使用时lisp-mode
,C-i
它会反弹lisp-indent-line
.
我可以lisp-mode
单独完成并在每个其他模式中覆盖此绑定,但必须有一个更简单的方法.每次我为新文件类型安装新模式时,我都必须返回并检查以确保所有的键绑定都没有被新模式覆盖.
我想这样做是因为我想模仿我已经学习并从其他编辑器根深蒂固的绑定.
我对所有"覆盖"键绑定使用次要模式:
(defvar my-keys-minor-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "C-i") 'some-function) map) "my-keys-minor-mode keymap.") (define-minor-mode my-keys-minor-mode "A minor mode so that my key settings override annoying major modes." :init-value t :lighter " my-keys") (my-keys-minor-mode 1)
这有一个额外的好处是能够一举关闭我的所有修改(只是禁用次要模式)以防其他人正在驾驶键盘或者我需要查看默认键绑定的作用.
请注意,您可能需要在迷你缓冲区中将其关闭:
(defun my-minibuffer-setup-hook () (my-keys-minor-mode 0)) (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)
作为scottfrazer答案的补充,我编写了以下内容,以便我的键绑定保留优先权,即使后续加载的库带来了他们自己的新键盘图.
因为键盘映射可以在编译时生成,所以load
似乎是最好的地方.
(add-hook 'after-load-functions 'my-keys-have-priority)
(defun my-keys-have-priority (_file)
"Try to ensure that my keybindings retain priority over other minor modes.
Called via the `after-load-functions' special hook."
(unless (eq (caar minor-mode-map-alist) 'my-keys-minor-mode)
(let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
(assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
(add-to-list 'minor-mode-map-alist mykeys))))
安装use-package
,评估并完成:
(require 'bind-key) (bind-key* "C-i" 'some-function)
我在搜索"emacs undefine org mode keybindings"时发现了这个问题,因为我想解除现有的Cc Cb行为,以允许我的全局映射使bury-buffer在组织缓冲区中工作.
这最终成为我最简单的解决方案:
(add-hook 'org-mode-hook (lambda () (local-unset-key (kbd "C-c C-b"))))
虽然scottfrazer的答案正是你所要求的,但我会提到后人的另一种解决方案.
来自Emacs手册:
"不要将Cc字母定义为Lisp程序中的密钥.由Cc和字母组成的序列(大写或小写)是为用户保留的;它们是为用户保留的唯一序列,因此不要阻止它们."
如果您将个人全局绑定绑定到Cc加上一封信,那么您"应该"是安全的.但是,这只是一个约定,任何模式仍然可以覆盖您的绑定.