我是从vim转到Emacs的,对vim的按键方式依赖较大。 参照山人第二季前10集简单配置了Emacs,发现虽然使用了 evil mode , 但是在有些buffer中vim的motion并不能工作,比如:
- list-buffers
- agenda view
- recenf-dialog
这些mode都使用了 n/p 和 C-n/C-p 实现光标的上下移动。
我做了如下配置,使得buffer-list 和 agenda view里可以使用 j/k 进行光标移动:
;;在buffer list中使j/k键绑定为下/上移一行
(evil-define-key 'normal tabulated-list-mode-map
(kbd "j") 'next-line
(kbd "k") 'previous-line)
;;在agenda view中使j/k键绑定为下/上移一行(与默认的n/p交换)
(require 'org-agenda)
(define-key org-agenda-mode-map "j" 'org-agenda-next-line)
(define-key org-agenda-mode-map "k" 'org-agenda-previous-line)
(define-key org-agenda-mode-map "n" 'org-agenda-goto-date)
(define-key org-agenda-mode-map "p" 'org-agenda-capture)
查阅了 'recentf-open-files
所打开的 major mode后我觉得下面的代码可以使得 j/k 移动生效,但是却没有成功:
;;在recentf-dialog中使j/k键绑定为下/上移一行(失败)
(evil-define-key 'normal recentf-dialog-mode-map
(kbd "j") 'next-line
(kbd "k") 'previous-line)
我不清楚为什么,请教大家该怎么设置? 我使用如下方式可以让vim的键移动都生效:
(setq evil-motion-state-modes (append evil-emacs-state-modes evil-motion-state-modes))
但是这样替换量太大了,会使得一些本来好用的键绑定不再生效。 我对lisp还不熟,不知道下面的代码为什么也不行:
(with-eval-after-load 'recentf-dialog
(setq evil-motion-state-modes (append evil-emacs-state-modes evil-motion-state-modes))
(setq evil-emacs-state-modes nil)
)
这个需求在spacemacs体验好像挺好的,不过我想先熟悉一下emacs。