Emacs 解除邪恶的束缚';sc-w映射?

Emacs 解除邪恶的束缚';sc-w映射?,emacs,evil-mode,Emacs,Evil Mode,我正在用邪恶模式测试Emacs 我想使用C-w作为我自己的窗口操作快捷方式的前缀,这些快捷方式是全局定义的,而不仅仅是针对具有邪恶模式的缓冲区。我在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 (

我正在用邪恶模式测试Emacs

我想使用C-w作为我自己的窗口操作快捷方式的前缀,这些快捷方式是全局定义的,而不仅仅是针对具有邪恶模式的缓冲区。我在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)
如果未加载邪恶,则此操作有效,但当我加载邪恶时,它会覆盖任何冲突的映射(例如C-w b)

我也可以从中注释出L106-158和L236,并且我的地图工作正常,但我不想修改evil-maps.el


有没有办法防止邪恶使用C-w前缀,或者在加载后取消设置它?

加载某些包后最简单的方法是使用
eval after load
。在您的示例中,您可以将其放在.emacs中:

(defun set-control-w-shortcuts ()
  (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))


(set-control-w-shortcuts)

(eval-after-load "evil-maps"
  '(progn
     (define-key evil-window-map "\C-w" 'nil)
     (set-control-w-shortcuts)))

加载某个包后执行操作的最简单方法是使用
eval after load
。在您的示例中,您可以将其放在.emacs中:

(defun set-control-w-shortcuts ()
  (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))


(set-control-w-shortcuts)

(eval-after-load "evil-maps"
  '(progn
     (define-key evil-window-map "\C-w" 'nil)
     (set-control-w-shortcuts)))

C-w
前缀将您切换到
evil窗口映射
,因此在该映射中取消定义
C-w
将没有帮助。“邪恶贴图”文件中相关的键映射将
邪恶运动状态贴图中的
C-w
设置为
邪恶窗口贴图
,该绑定由大多数其他邪恶贴图继承。您可以将该键绑定设置为
nil
,这样您就可以通过以下方式使用自己的绑定:

(eval-after-load "evil-maps"
  (define-key evil-motion-state-map "\C-w" nil))
但是,无论是
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)))

您也可以将
nil
替换为
'my-window-map
,以重新绑定到您自己的映射,但它可能已经通过调用
global set key
C-w
前缀将您切换到
邪恶窗口映射
,因此在该映射中取消定义
C-w
不会有帮助。“邪恶贴图”文件中相关的键映射将
邪恶运动状态贴图中的
C-w
设置为
邪恶窗口贴图
,该绑定由大多数其他邪恶贴图继承。您可以将该键绑定设置为
nil
,这样您就可以通过以下方式使用自己的绑定:

(eval-after-load "evil-maps"
  (define-key evil-motion-state-map "\C-w" nil))
但是,无论是
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)))

您也可以将
nil
替换为
'my-window-map
,以重新绑定到您自己的映射,但它可能已经通过调用
全局设置键

eval after load
上显示为是,但是
邪恶窗口映射
是用于此目的的错误映射。查看我关于邪恶地图的答案。对于一些来自vim的人,他们使用箭头键像我一样导航:
(定义键我的窗口地图(kbd“”)“windmove left”(定义键我的窗口地图(kbd“”)“windmove down)(定义键我的窗口地图(kbd“”)“windmove up)(定义键我的窗口地图(kbd“”)“windmove right))
加载后评估上的是,但是
邪恶窗口映射
是错误的映射。查看我关于邪恶地图的答案。对于一些来自vim的人,他们使用箭头键像我一样导航:
(定义键我的窗口地图(kbd“”)“windmove left”(定义键我的窗口地图(kbd“”)“windmove down)(定义键我的窗口地图(kbd“”)“windmove up)(定义键我的窗口地图(kbd“”)“windmove right))