Emacs evil:一般窗口移动重新映射

fhy*_*yve 5 emacs evil-mode

这是我应该问的问题而不是这个问题:

Emacs evil:空间作为运动状态的前缀键

我想定义一堆用于在除插入模式之外的所有状态下移动、在它们之间移动、打开和关闭窗口和缓冲区的命令,并且都是“SPC”形式。能够设置一次并且在任何地方都很好(除非有冲突,尽管覆盖会很好),但如果这不容易,我也想知道如何覆盖新状态下的键绑定我遇到了我的键绑定不起作用的地方。希望知道这也能帮助我编辑任意状态下的键绑定。

我目前拥有的是:

(define-key evil-normal-state-map (kbd "SPC") nil) 
(define-key evil-motion-state-map (kbd "SPC") nil) 

(define-key evil-motion-state-map (kbd "SPC h") 'evil-window-left)
(define-key evil-motion-state-map (kbd "SPC j") 'evil-window-down)
(define-key evil-motion-state-map (kbd "SPC k") 'evil-window-up)
(define-key evil-motion-state-map (kbd "SPC l") 'evil-window-right)

(define-key evil-normal-state-map (kbd "SPC h") 'evil-window-left)
(define-key evil-normal-state-map (kbd "SPC j") 'evil-window-down)
(define-key evil-normal-state-map (kbd "SPC k") 'evil-window-up)
(define-key evil-normal-state-map (kbd "SPC l") 'evil-window-right)
Run Code Online (Sandbox Code Playgroud)

和“SPC H”等用于移动窗口。它在列表缓冲区或 Dired 中不起作用。邪恶领袖似乎只适用于普通模式。

Hen*_* L. 4

我们再见面。

也许定义一个前缀键映射并绑定到它会更简单。例如:

(define-prefix-command 'my-window-map)

(let ((map my-window-map))
  (define-key map "h" 'evil-window-left)
  (define-key map "j" 'evil-window-down)
  (define-key map "k" 'evil-window-up)
  (define-key map "l" 'evil-window-right)

  (define-key map "H" 'evil-window-move-far-left)
  (define-key map "J" 'evil-window-move-very-bottom)
  (define-key map "K" 'evil-window-move-very-top)
  (define-key map "L" 'evil-window-move-far-right)

  ;; And presumably, for opening/closing
  (define-key map "v" 'evil-window-vsplit)
  (define-key map "s" 'evil-window-split)
  (define-key map "c" 'evil-window-delete))
Run Code Online (Sandbox Code Playgroud)

然后您可以以各种模式将前缀键映射映射到 SPC:

;; Do this for each state you want these bindings available
(define-key evil-motion-state-map " " 'my-window-map)
(define-key evil-visual-state-map " " 'my-window-map)
;; You don't need to unbind/rebind evil-normal-state-map --
;; there is no default mapping for " ". Also: unbound keys in normal
;; mode will fall through to motion bindings.

;; For particular modes (like dired and list-buffer window)
(define-key dired-mode-map " " 'my-window-map)
(define-key Buffer-menu-mode-map " " 'my-window-map)
Run Code Online (Sandbox Code Playgroud)

或者,您可以在正常模式下启动 dired 和 list-buffer。这可能会干扰它们的默认映射。

(evil-set-initial-state 'dired-mode 'normal)
(evil-set-initial-state 'Buffer-menu-mode 'normal)
Run Code Online (Sandbox Code Playgroud)

如果您发现您的映射被另一种模式覆盖(这对于该键来说不应该是常见的),您可以尝试添加my-window-mapevil-overriding-maps: (add-to-list 'evil-overriding-maps '(my-window-map))。据推测,这会赋予这些地图优先权。

免责声明:我没有对此进行测试。我发现在冲突的插件中取消定义键更简单。


附带说明一下,所有这些命令都已在邪恶窗口地图中可用。将 SPC 映射到此可能会更简单:

(define-key evil-motion-state-map " " 'evil-window-map)
(define-key evil-visual-state-map " " 'evil-window-map)
...
Run Code Online (Sandbox Code Playgroud)