解除邪恶的Cw映射?

hae*_*ken 1 emacs evil-mode

我正在尝试使用Evil模式的Emacs.

我想C-w用作我自己的全局定义的窗口操作快捷方式的前缀,而不仅仅是用于具有Evil模式的缓冲区.我在init.el中有以下代码

(define-prefix-command 'my-window-map)
(global-set-key (kbd "C-w") 'my-window-map)
(define-key my-window-map (kbd "h") 'windmove-left)
(define-key my-window-map (kbd "j") 'windmove-down)
(define-key my-window-map (kbd "k") 'windmove-up)
(define-key my-window-map (kbd "l") 'windmove-right)
(define-key my-window-map (kbd "v") 'split-window-right)
(define-key my-window-map (kbd "b") 'split-window-below)
(define-key my-window-map (kbd "x") 'delete-window)
(define-key my-window-map (kbd "o") 'delete-other-windows)
Run Code Online (Sandbox Code Playgroud)

如果没有加载Evil,这是有效的,但是当我加载Evil时,它会覆盖任何冲突的地图(C-w b例如).

我还可以从evil-maps.el中注释出L106-158和L236 ,我的地图可以工作,但我宁愿不处理修改evil-maps.el.

有没有办法阻止Evil使用C-w前缀,或者之后取消设置?

Dan*_*Dan 9

C-w前缀您切换evil-window-map,所以取消定义C-w该地图也无济于事.在"恶地图"文件,该文件是相关的套键映射C-wevil-motion-state-mapevil-window-map,并结合通过继承大部分的其他邪恶的地图.您可以将键绑定设置为nil以便以这种方式使用自己的绑定:

(eval-after-load "evil-maps"
  (define-key evil-motion-state-map "\C-w" nil))
Run Code Online (Sandbox Code Playgroud)

但是,既不是evil-insert-state-map也不evil-emacs-state-map是以这种方式继承(我很确定),所以你也需要在这些地图中解除绑定.因此,请使用以下方法一次性取消绑定所有3个地图:

(eval-after-load "evil-maps"
  (dolist (map '(evil-motion-state-map
                 evil-insert-state-map
                 evil-emacs-state-map))
    (define-key (eval map) "\C-w" nil)))
Run Code Online (Sandbox Code Playgroud)

您也可以将nilwith 替换'my-window-map为重新绑定到您自己的映射,但它可能已经通过您的调用公开了global-set-key.