如何在视觉线之间移动并在邪恶模式中移过新线

kal*_*alj 15 emacs evil-mode

在"正常"状态下evil-mode,光标移动模拟了vim的标准行为.我希望通过以下两种方式使其更类似于标准的emacs行为.

  1. 我希望垂直运动发生在视觉线内,而不是逻辑线.即如果一条线被包裹,按下j<down>应该移动到同一条线的下一部分.

  2. 我希望水平移动不会停留在换行符上.即如果光标位于一行的末尾,则按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)


xwl*_*xwl 5

重映射解决方案会使类似“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)