1

我正在尝试 Emacs 与 Evil 模式。

我想将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)

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

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

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

4

2 回答 2

9

C-w前缀会将您切换evil-window-map因此在该C-w地图中取消定义将无济于事。“evil-maps”文件中相关的键映射设置C-wevil-motion-state-mapevil-window-map并且该绑定被大多数其他邪恶映射继承。您可以将该键绑定设置为,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)))

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

于 2014-07-28T08:55:18.737 回答
1

加载某些包后最简单的方法是使用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)))
于 2014-07-28T06:34:44.793 回答