全局覆盖Emacs中的键绑定

我怎样才能设置一个全局覆盖的键绑定,并优先于该键的所有其他绑定? 我想覆盖所有主要/次要模式映射,并确保我的绑定始终有效。

这当然不起作用:

(global-set-key "\Ci" 'some-function) 

它以text-mode ,但是当我使用lisp-modeCi被反弹到lisp-indent-line

我可以在lisp-mode和每个其他模式下单独重写这个绑定,但是必须有一个更简单的方法。 每次我为新的文件types安装一个新的模式时,我都必须回去检查一下,确保我的所有密钥绑定都不被新模式覆盖。

我想这样做,因为我想模仿我已经学习和从其他编辑根深蒂固的绑定。

我使用所有“覆盖”键绑定的次要模式:

 (defvar my-keys-minor-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "Ci") '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) 

这有附加的好处,能够一举closures所有我的修改(只是禁用次要模式),以防别人正在驾驶键盘,或者如果我需要看看默认的键绑定。

请注意,您可能需要在minibuffer中closures此function:

 (defun my-minibuffer-setup-hook () (my-keys-minor-mode 0)) (add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook) 

除了scottfrazer的答案 ,我已经写了以下内容,以便我的键绑定保持优先权,即使随后加载的库引入了自己的新键盘映射。

因为keymaps可以在编译时生成,所以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)))) 

我在search“emacs undefine org mode keybindings”时发现了这个问题,因为我想解除绑定现有的Cc Cb行为,以允许我的全局映射缓冲区在org缓冲区中工作。

这对我来说是最简单的解决scheme:

 (add-hook 'org-mode-hook (lambda () (local-unset-key (kbd "Cc Cb")))) 

虽然scottfrazer的答案正是你所要求的,我会提到后代另一种解决scheme。

从Emacs手册 :

“不要将Cc字母定义为Lisp程序中的一个键,由Cc和一个字母组成的序列(大写或小写)是为用户保留的,它们是为用户保留的唯一序列,所以不要屏蔽它们。

如果你绑定你的个人全局绑定到抄送加一个字母,那么你“应该”是安全的。 但是,这只是一个约定,任何模式仍然能够覆盖你的绑定。

安装use-package ,eval,你就完成了:

 (require 'bind-key) (bind-key* "Ci" 'some-function) 

如果你想“总是使用地图上的keybinds ,除非我明确地覆盖他们的特定模式地图”,并假设你正在使用斯科特弗雷泽的方法 ,你想要:

 (defun locally-override (key cmd) (unless (local-variable-p 'my-keys-minor-mode-map) (set (make-variable-buffer-local 'my-keys-minor-mode-map) (make-sparse-keymap)) (set-keymap-parent my-keys-minor-mode-map (default-value 'my-keys-minor-mode-map))) (define-key my-keys-minor-mode-map key cmd)) 

所以

 (locally-override "\Ci" nil) 

应仅从当前缓冲区中的次要模式删除“\ Ci”绑定。 警告:这是完全未经testing的,但似乎是正确的方法。 设置父级而不是仅仅处理my-keys-minor-mode-map的全局值的这一点是以后任何对全局值的更改都会自动反映到本地值中。

除非你真的想自己做,否则你应该检查一下,看看是否有其他人已经做到了。

有一个Emacs的包,它可以让你的窗口像键盘绑定。 你应该可以通过谷歌find它。

我不认为你可以。 这大致相当于说你想定义一个全局variables,它不能被函数中的局部variables声明隐藏。 范围只是不这样工作。

但是,可能有一种方法可以编写一个elisp函数来通过模式列表,并为您重新分配每一个函数。