我使用这里说明的方法:全局覆盖密钥绑定在emacs中
(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."
;; Define-minor-mode will use `my-keys-minor-mode-map' for us.
:init-value t
:lighter " my-keys")
(defun my-keys-keep-on-top (&rest _)
"Try to ensure that my keybindings always have priority."
(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))))
(add-hook 'after-load-functions #'my-keys-keep-on-top)
(my-keys-minor-mode 1)我如何显式地覆盖这个?链接中的方法对我不起作用。
EDIT2 :
问题不仅适用于只读模式。eval-after-load不是一个很好的方法,因为它长期地改变了my-minor-mode-keymap。
我在这里再举一个例子:
我大部分时间都使用程序模式。假设我想让C-q绑定到语法-签入程序模式。然而,有时我会在文本模式下草草记下。在文本模式下进行语法检查是没有意义的。所以我决定让C-q绑定到拼写检查。
在正常情况下,我会这么做
(global-set-key (kbd "C-q") 'syntax-check)
(define-key text-mode-map (kbd "C-q") 'spell-check)如果我定义了我的键-小模式映射,如何产生这样的效果?假设我把这个放在我的密钥映射中:
(define-key 'my-keys-minor-mode-map (kbd "C-q") 'syntax-check)(define-key text-mode-map (kbd "C-q") 'spell-check)无法工作,因为我的密钥映射总是优先于其他次要模式映射。
都不是
(eval-after-load "text-mode"
(define-key my-keys-minor-mode-map (kbd "C-q") 'spell-check))nor
(add-hook 'text-mode-map (lambda ()
(define-key my-keys-minor-mode-map (kbd "C-q") 'spell-check)))做一个好的工作,因为他们改变了我的键-小模式-映射在长期。这意味着当我从文本模式切换到程序模式时,我会失去语法检查功能。
编辑:
例如,
(define-key my-keys-minor-mode-map (kbd "<return>") 'newline-and-indent)这是工作99%的时间,是很好地防止任何其他次要模式或主要模式来修改这一点。
但是,密钥映射在只读模式下存在问题。所以我需要有“超级优先级”功能来重新映射这个键。我想要像这样的
(defun super-priority-map()
(define-key super-my-keys-minor-mode-map (kbd "<return>") 'something-else))
(add-hook 'some-modes 'super-priority-map)更重要的是,只要保留指定的模式,超优先级映射就应该起飞。
发布于 2016-01-01 18:54:36
你说的是只读功能?你不能用键映射来覆盖它。没有捕获所有击键和发出错误的“只读”密钥映射。
要覆盖read-only-mode,只需关闭read-only-mode!
在代码中,设置buffer-read-only变量。
您还可以让-绑定代码中的inhibit-read-only变量来忽略所有只读机制(包括特定文本区域的属性--参见下面列表中的级别7和3)。
除了只读之外,其他键映射完全有可能优先于您的次要模式映射,但我倾向于说,对于与您的小模式密钥映射发生的任何罕见冲突,您应该直接修改与您自己的模式映射冲突的密钥映射。
您的次要模式keymap实际上可以被许多其他模式所取代,但是您可能不希望在更高的优先级上工作。
我推荐您阅读掌握Emacs中的键绑定,这是一个非常容易读懂的解释,说明了这些内容是如何工作的,并从中获得了以下密钥映射优先级列表:
overriding-terminal-local-map。overriding-local-map用于应该覆盖所有其他本地键映射的键。如果你用这个,要非常小心!Keymap char属性是at。这是用于诸如yasnippet中的字段和定制对话框之类的内容。emulation-mode-map-alistsminor-mode-overriding-map-alist,用于在主要模式中覆盖次要模式使用的键映射。minor-mode-map-alist与上面的覆盖版本完全一样,但它是为次要模式指定键映射的首选方法。Keymap文本属性与上面用于char属性的属性类似,但仅适用于文本属性。current-local-mapcurrent-global-map是Emacs寻找键绑定的最后一个地方,也是全局绑定的地方。请注意,您的次要模式在第6级工作,上面的所有内容都可以优先处理。
解除冲突的典型模式是:
(eval-after-load "NAME-OF-LIBRARY"
'(define-key NAME-OF-KEYMAP (kbd "KEY") nil)) ;; unbind KEY in KEYMAP implemented by LIBRARY最有可能的是,您还会为原始命令添加替换(非冲突)绑定。
https://stackoverflow.com/questions/34554427
复制相似问题