2015-11-15 43 views
1

這是問題,我應該問的這個代替:Emacs的邪惡:普通窗口移動重映射

Emacs evil: space as a prefix key in motion state

我想定義一堆移動命令,打開和關閉窗口之間移動除插入模式以外的所有狀態下工作的緩衝區,都是「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) 

和 「SPC H」 等的移動窗口。它在列表緩衝區或Dired中不起作用。邪惡的領導者似乎只適用於正常模式。

回答

1

我們再見面。

也許它會是簡單的定義一個前綴鍵盤映射和綁定到它。例如:

(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)) 

然後你就可以在各種模式映射前綴鍵盤映射到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) 

或者,你可以有dired,在正常模式列表緩衝區的開始。這可能會干擾他們的默認映射。

(evil-set-initial-state 'dired-mode 'normal) 
(evil-set-initial-state 'Buffer-menu-mode 'normal) 

如果你發現你的映射通過其他方式(這不應該是對於關鍵共性)覆蓋,你可以嘗試添加my-window-mapevil-overriding-maps(add-to-list 'evil-overriding-maps '(my-window-map))。據推測,這些地圖優先。

免責聲明:我沒有測試過這一點。我發現在衝突插件中取消定義鍵更簡單。


在附註中,所有這些命令都是already available in evil-window-map。您可能更簡單地將SPC映射到:

(define-key evil-motion-state-map " " 'evil-window-map) 
(define-key evil-visual-state-map " " 'evil-window-map) 
...