首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖(全局覆盖emacs中的键绑定)

覆盖(全局覆盖emacs中的键绑定)
EN

Stack Overflow用户
提问于 2016-01-01 07:37:28
回答 1查看 1.1K关注 0票数 0

我使用这里说明的方法:全局覆盖密钥绑定在emacs中

代码语言:javascript
复制
(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绑定到拼写检查。

在正常情况下,我会这么做

代码语言:javascript
复制
(global-set-key (kbd "C-q") 'syntax-check)
(define-key text-mode-map (kbd "C-q") 'spell-check)

如果我定义了我的键-小模式映射,如何产生这样的效果?假设我把这个放在我的密钥映射中:

代码语言:javascript
复制
(define-key 'my-keys-minor-mode-map (kbd "C-q") 'syntax-check)

(define-key text-mode-map (kbd "C-q") 'spell-check)无法工作,因为我的密钥映射总是优先于其他次要模式映射。

都不是

代码语言:javascript
复制
(eval-after-load "text-mode"
  (define-key my-keys-minor-mode-map (kbd "C-q") 'spell-check))

nor

代码语言:javascript
复制
(add-hook 'text-mode-map (lambda () 
  (define-key my-keys-minor-mode-map (kbd "C-q") 'spell-check)))

做一个好的工作,因为他们改变了我的键-小模式-映射在长期。这意味着当我从文本模式切换到程序模式时,我会失去语法检查功能。

编辑:

例如,

代码语言:javascript
复制
(define-key my-keys-minor-mode-map (kbd "<return>") 'newline-and-indent)

这是工作99%的时间,是很好地防止任何其他次要模式或主要模式来修改这一点。

但是,密钥映射在只读模式下存在问题。所以我需要有“超级优先级”功能来重新映射这个键。我想要像这样的

代码语言:javascript
复制
(defun super-priority-map()
  (define-key super-my-keys-minor-mode-map (kbd "<return>") 'something-else))
(add-hook 'some-modes 'super-priority-map)

更重要的是,只要保留指定的模式,超优先级映射就应该起飞。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-01 18:54:36

你说的是只读功能?你不能用键映射来覆盖它。没有捕获所有击键和发出错误的“只读”密钥映射。

要覆盖read-only-mode,只需关闭read-only-mode

在代码中,设置buffer-read-only变量。

您还可以让-绑定代码中的inhibit-read-only变量来忽略所有只读机制(包括特定文本区域的属性--参见下面列表中的级别7和3)。

除了只读之外,其他键映射完全有可能优先于您的次要模式映射,但我倾向于说,对于与您的小模式密钥映射发生的任何罕见冲突,您应该直接修改与您自己的模式映射冲突的密钥映射。

您的次要模式keymap实际上可以被许多其他模式所取代,但是您可能不希望在更高的优先级上工作。

我推荐您阅读掌握Emacs中的键绑定,这是一个非常容易读懂的解释,说明了这些内容是如何工作的,并从中获得了以下密钥映射优先级列表:

  1. 用于终端特定密钥绑定的overriding-terminal-local-map
  2. overriding-local-map用于应该覆盖所有其他本地键映射的键。如果你用这个,要非常小心!
  3. 字符点本地的键映射的Keymap char属性是at。这是用于诸如yasnippet中的字段和定制对话框之类的内容。
  4. 用于高级多模式密钥图管理的emulation-mode-map-alists
  5. minor-mode-overriding-map-alist,用于在主要模式中覆盖次要模式使用的键映射。
  6. minor-mode-map-alist与上面的覆盖版本完全一样,但它是为次要模式指定键映射的首选方法。
  7. 点处的Keymap文本属性与上面用于char属性的属性类似,但仅适用于文本属性。
  8. 用于缓冲区当前本地映射中定义的键映射的current-local-map
  9. current-global-map是Emacs寻找键绑定的最后一个地方,也是全局绑定的地方。

请注意,您的次要模式在第6级工作,上面的所有内容都可以优先处理。

解除冲突的典型模式是:

代码语言:javascript
复制
(eval-after-load "NAME-OF-LIBRARY"
  '(define-key NAME-OF-KEYMAP (kbd "KEY") nil)) ;; unbind KEY in KEYMAP implemented by LIBRARY

最有可能的是,您还会为原始命令添加替换(非冲突)绑定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34554427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档