全局覆盖Emacs中的键绑定

全局覆盖Emacs中的键绑定

如何设置全局覆盖并优先于该键的所有其他绑定的键绑定?我希望覆盖所有主要/次要模式映射,并确保绑定始终有效。

当然,这是行不通的:

(global-set-key "\C-i" 'some-function)

它在text-mode,但是当我用lisp-modeC-i是反弹到lisp-indent-line.

我可以在lisp-mode每一种模式都是个别的,但必须有更简单的方法。每次为新文件类型安装新模式时,我都必须返回并检查,以确保所有的键绑定都不会被新模式覆盖。

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


红颜莎娜
浏览 649回答 3
3回答

繁花不似锦

对于所有“覆盖”键绑定,我使用一个次要模式:(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)

qq_遁去的一_1

作为对.的补充斯科特弗雷泽的回答,我编写了以下代码,这样我的键绑定就保留了优先级,即使随后加载的库引入了它们自己的新键映射。因为密钥映射可以在编译时生成,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)
打开App,查看更多内容
随时随地看视频慕课网APP