在“正常”状态下evil-mode
,光标移动模拟 vim 的标准行为。我想通过以下两种方式使其更类似于标准的 emacs 行为。
我希望垂直运动发生在视线内,而不是逻辑线。即,如果一行被换行,按下
j
或<down>
应该移动到同一行的下一部分。我希望水平移动不要停在换行符处。即如果光标在一行的末尾,按
l
或<right>
应该移动到下一行。
我怎样才能做到这一点?
我找到了解决问题 2 的方法:原来有一个变量evil-cross-lines
. 将其设置为t
简单地解决了该问题。
连同 PythonNut 对垂直移动的修复,这里是完整的解决方案:
;; Make movement keys work like they should
(define-key evil-normal-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
(define-key evil-normal-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
(define-key evil-motion-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
(define-key evil-motion-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
; Make horizontal movement cross lines
(setq-default evil-cross-lines t)
重映射解决方案会使“dj”之类的组合失败。下面的建议解决方案仍然保持 `dj' 的正确行为:
(defun evil-next-line--check-visual-line-mode (orig-fun &rest args)
(if visual-line-mode
(apply 'evil-next-visual-line args)
(apply orig-fun args)))
(advice-add 'evil-next-line :around 'evil-next-line--check-visual-line-mode)
(defun evil-previous-line--check-visual-line-mode (orig-fun &rest args)
(if visual-line-mode
(apply 'evil-previous-visual-line args)
(apply orig-fun args)))
(advice-add 'evil-previous-line :around 'evil-previous-line--check-visual-line-mode)
我似乎无法正确运动。C-h k l
说right-char
。
;; kill two birds with one stone using remap: arrow keys and h,j,k,l
(define-key evil-normal-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
(define-key evil-motion-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
(define-key evil-motion-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
(define-key evil-normal-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
(define-key evil-normal-state-map (kbd "<remap> <evil-backward-char>") 'left-char)
(define-key evil-motion-state-map (kbd "<remap> <evil-forward-char>") 'right-char)
(define-key evil-normal-state-map (kbd "<remap> <evil-backward-char>") 'left-char)
(define-key evil-motion-state-map (kbd "<remap> <evil-forward-char>") 'right-char)
2)至于第二个问题(好点),我设法做到了以下几点。我不知道如何告诉邪恶不要在行尾/行首停止,但我知道如何重新定义一些键:
(define-key evil-normal-state-map "h" 'left-char) ;;remaps evil's h to emacs' left movement
左键:
(define-key evil-normal-state-map [left] 'left-char)
但是对 emacs 做同样的事情是right-char
行不通的:/我正在研究它。
ps:要查找与键关联的功能:C-h k <your key>