在"正常"状态下evil-mode
,光标移动模拟了vim的标准行为.我希望通过以下两种方式使其更类似于标准的emacs行为.
我希望垂直运动发生在视觉线内,而不是逻辑线.即如果一条线被包裹,按下j
或<down>
应该移动到同一条线的下一部分.
我希望水平移动不会停留在换行符上.即如果光标位于一行的末尾,则按l
或<right>
应移至下一行.
我怎样才能做到这一点?
kal*_*alj 22
我找到了如何解决问题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)
Run Code Online (Sandbox Code Playgroud)
重映射解决方案会使类似“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)
Run Code Online (Sandbox Code Playgroud)