折行后怎么针对visual-line移动光标?(evil-normal)

我在折行后也使用了 j,k来移动光标:

  (define-key evil-normal-state-map (kbd "j") 'evil-next-visual-line)
  (define-key evil-normal-state-map (kbd "k") 'evil-previous-visual-line)

我同时也开启了相对行号

(global-linum-mode t)  
(linum-relative-global-mode t)

因此我就遇到了一个问题,如图:

当我的光标处于行号指示的第2行时,我想按 k调到行号指示的第1行。可实际上我跳的是和第2行相邻的上一行。 所以我想请教一下: 怎样在折行情况下,让相对行号和jk的移动相匹配,同时折行后能方便地上下移动光标?


另外我这样设置, gkgj 却没有成功,似乎被占用了:

  (define-key evil-normal-state-map (kbd "gj") 'evil-next-visual-line)
  (define-key evil-normal-state-map (kbd "gk") 'evil-previous-visual-line)

你需要的是 evil-previous-line, 这个默认绑定的是方向键上。

不行啊! 你说的是这样吗:

  ;; j and k to behave like g j and g k
  (define-key evil-normal-state-map (kbd "gj") 'evil-next-line)
  (define-key evil-normal-state-map (kbd "gk") 'evil-previous-line)

而且我看evil-previous-line默认的绑定就是 k

我现在这样做:

(define-key evil-normal-state-map (kbd ",j") 'evil-next-line)
(define-key evil-normal-state-map (kbd ",k") 'evil-previous-line)

可以在折行情况下使用,j向下移动光标、,k向上移动光标,这样没有破坏jk和相对行号的联系。

说明:

  1. 之所以不用gk, gj是因为我发现在org-mode下,这两个快捷键被覆盖了,对应的功能是向同级的Heading上下移动。
  2. 在vim中,针对折行,可以使用gk, gj, gh, gl, g$ 等等只对 当前visual-line的光标移动操作,不知道在spacemacs里这些功能都去哪里了?需要自己hacking吗?大家是怎么解决的?

spacemacs 默认设置和vim是一样的,jknext-lineprevious-line, gjgknext-visual-lineprevious-visual-line 如果你习惯按照 line 而不是 visual-line 来移动,那就不要改。 如果你习惯按照 visual-line 而不是 line 来移动,那就把 键绑定换一下就好。

我看你帖子开头就是把 jk 绑定到 evil-next-visual-lineevil-previous-visual-line 了,那你应该更习惯安装 visual-line 来移动才对。可是看下文,你貌似更习惯安装 line 的形式来移动?那就不要更改原来的键绑定啊。 另外测试键绑定有没有成功,建议先在 scratch 里试一下,在别的mode尤其是 org-mode里,很容易就键冲突了啊。

原来是这样,多谢!

我把

加入到init.el里面,报错

我是spacemacs,放到dotspacemacs/user-config ()下没有问题

我没有安装spacemacs,你知道该怎么设置吗?

(with-eval-after-load 'evil
  (define-key evil-normal-state-map (kbd ",j") 'evil-next-line)
  (define-key evil-normal-state-map (kbd ",k") 'evil-previous-line)
  )

谢谢!

但是按jk碰到折行还是会跳过去。我想要的效果是按jk能跳到折行上。

我试了改成

(with-eval-after-load 'evil (define-key evil-normal-state-map (kbd “,j”) 'evil-next-visual-line) (define-key evil-normal-state-map (kbd “,k”) 'evil-previous-visual-line) )

依然不行,请问应该怎么办?

(with-eval-after-load 'evil ...) 里面…部分的代码我是随便贴的,具体设置自行决定。

想要按 kj 生效就不要 leader-key:

(with-eval-after-load 'evil
  (define-key evil-normal-state-map (kbd "j") 'evil-next-visual-line)
  (define-key evil-normal-state-map (kbd "k") 'evil-previous-visual-line)
  )
1 个赞

谢谢,问题解决!