当前位置:  开发笔记 > 开发工具 > 正文

全局覆盖Emacs中的键绑定

如何解决《全局覆盖Emacs中的键绑定》经验,为你挑选了5个好方法。

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

这当然不起作用:

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

它起作用text-mode,但是当我使用时lisp-mode,C-i它会反弹lisp-indent-line.

我可以lisp-mode单独完成并在每个其他模式中覆盖此绑定,但必须有一个更简单的方法.每次我为新文件类型安装新模式时,我都必须返回并检查以确保所有的键绑定都没有被新模式覆盖.

我想这样做是因为我想模仿我已经学习并从其他编辑器根深蒂固的绑定.



1> scottfrazer..:

我对所有"覆盖"键绑定使用次要模式:

(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)


确保您的次要模式在列表minor-mode-map-alist上排在第一位.
Brian Carper:这是一个增强处理随后加载的次要模式:http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797
特雷是对的.通常将它放在.emacs的末尾就足够了.此外,您覆盖的大多数绑定将是主要模式设置的绑定...小模式通常不会妨碍.

2> phils..:

作为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))))


您可以使用`afer-load-functions`钩子而不是建议.

3> Mirzhan Irke..:

安装use-package,评估并完成:

(require 'bind-key)
(bind-key* "C-i" 'some-function)


虽然use-package依赖于bind-key,但只安装bind-key对于用例就足够了.
这个('bind-key'包)似乎是最方便的解决方案; 感谢分享.

4> 小智..:

我在搜索"emacs undefine org mode keybindings"时发现了这个问题,因为我想解除现有的Cc Cb行为,以允许我的全局映射使bury-buffer在组织缓冲区中工作.

这最终成为我最简单的解决方案:

(add-hook 'org-mode-hook
      (lambda ()
        (local-unset-key (kbd "C-c C-b"))))



5> 小智..:

虽然scottfrazer的答案正是你所要求的,但我会提到后人的另一种解决方案.

来自Emacs手册:

"不要将Cc字母定义为Lisp程序中的密钥.由Cc和字母组成的序列(大写或小写)是为用户保留的;它们是为用户保留的唯一序列,因此不要阻止它们."

如果您将个人全局绑定绑定到Cc加上一封信,那么您"应该"是安全的.但是,这只是一个约定,任何模式仍然可以覆盖您的绑定.


Afaik,绑定这些是组织机构建议的第一步,以便使用它,但用户必须自己定义它们(即默认情况下不会这样做),并且可以选择其他任何其他方式.(也就是说,这是因为这些绑定应该是全局的,而不是绑定到org主模式)
我没想到所有模式的组织模式都打破了这个规则.`Cc Ch'告诉我Cc a,b,c和l分别绑定到org-agenda,org-iswitchb,org-capture和org-store-link.
推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有