vim用hjkl长线移动(屏幕线)

Mat*_*her 17 vim

在此输入图像描述

突出显示的文本是我想要移动的数组.我必须在按下j之前按下g以向下移动一条线.我的.vimrc是否有一些映射,我可以使用hjkl在屏幕行中移动而不必每次都按g.

谢谢你的帮助Matthias

And*_*ini 20

你可以重新映射jk键(不确定你是否真的需要hl..)

:map j gj
:map k gk
Run Code Online (Sandbox Code Playgroud)

一旦你尝试并喜欢它们,就把它们添加到你.vimrc的领先地位:

  • 这有效,但是你不应该使用`:noremap`,这样j不会递归映射?在这个例子中并不重要,但进入......这是一个好习惯 (4认同)

Ric*_*ick 15

我使用以下代码片段来帮助所有形式的导航,包括$ to end of line等.

" mapping to make movements operate on 1 screen line in wrap mode
function! ScreenMovement(movement)
   if &wrap
      return "g" . a:movement
   else
      return a:movement
   endif
endfunction
onoremap <silent> <expr> j ScreenMovement("j")
onoremap <silent> <expr> k ScreenMovement("k")
onoremap <silent> <expr> 0 ScreenMovement("0")
onoremap <silent> <expr> ^ ScreenMovement("^")
onoremap <silent> <expr> $ ScreenMovement("$")
nnoremap <silent> <expr> j ScreenMovement("j")
nnoremap <silent> <expr> k ScreenMovement("k")
nnoremap <silent> <expr> 0 ScreenMovement("0")
nnoremap <silent> <expr> ^ ScreenMovement("^")
nnoremap <silent> <expr> $ ScreenMovement("$")
Run Code Online (Sandbox Code Playgroud)

  • 为什么需要选项`<silent>`和`<expr>`?似乎在没有它们的情况下工作...而且,你可以使用`"gj"`等,而不是定义一个能够做到这一点的函数,特别是因为`gj`与`j`完全相同,当行是'n'时包裹... (7认同)

Ned*_*der 7

你可以简单地将j和k(例如)重新映射到gj和gk:

" map j to gj and k to gk, so line navigation ignores line wrap
nmap j gj
nmap k gk
Run Code Online (Sandbox Code Playgroud)

  • 好吧,如果你把它们映射到`.vimrc`,你可能会在以后遇到宏或插件问题.我知道输入`gj`和`gk`是很乏味的,也许将它与领导者映射将是一个更好的选择. (2认同)