请教下,有没有办法能确保自定义的快捷键不会被覆盖

最近想新增一些快捷键,但是发现很难生效,看了下,都是被别的el的快捷键覆盖了,因此来请教下大家

(global-set-key (kbd "s-e") 'move-end-of-line)
(global-set-key (kbd "s-a") 'move-beginning-of-line)

(global-set-key (kbd "s-x") 'nil)
(global-set-key (kbd "s-x") 'helm-M-x )

例如上面的s-x绑定helm-M-x, 谢谢大家!

你可以把自己的键都定义在一个minor mode下面,例如

(defvar my-keys-minor-mode-map (make-sparse-keymap) "my-keys-minor-mode keymap.")
(define-key my-keys-minor-mode-map (kbd "s-e") 'move-end-of-line)

最后让这个minor mode生效即可

(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-minor-mode 1)

或者可以用bind-key。作为use-package的依赖,覆盖率爆表。bind-key可以保证快捷键不被覆盖

显然你用了evil,那么要(define-key evil-normal-state-map (kbd "s-x") 'some-fun),evil的实现我不清楚,但不管是用的什么map,肯定比global-map的优先级高。keymap优先级大致是minor-mode-map>major-mode-map>globalstackexchange上的类似问题

谢谢大家的解答,试了下minor mode的方法,但是貌似没有效果,不知道为什么,代码如下

(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-minor-mode 1)
(defvar my-keys-minor-mode-map (make-sparse-keymap) "my-keys-minor-mode keymap.")
(define-key my-keys-minor-mode-map (kbd "s-x") 'helm-M-x)
(define-key my-keys-minor-mode-map (kbd "s-a") 'move-beginning-of-line)
(define-key my-keys-minor-mode-map (kbd "s-e") 'move-end-of-line)

这些快捷键用use-packege来绑定感觉也不太合适,不知道有没有更好的方法?

试试这个

(global-unset-key (kbd "s-e"))
(global-set-key (kbd "s-e") 'move-end-of-line)
(global-unset-key (kbd "s-a"))
(global-set-key (kbd "s-a") 'move-beginning-of-line)
(global-unset-key (kbd "s-x"))
(global-set-key (kbd "s-x") 'helm-M-x )

可以用use-package 中的bind-key*’,不会被其他minor mode 的快捷键覆盖!