我将列编号设置为相对模式,因为我喜欢不计数。我还将nnoremap
从j
添加到gj
,这样可以更容易地使用换行。问题是,当我在一条被包裹的线上做一个运动(比如2j
)时,它不会把我向上移动两行,而是两条"线"。
为了解决这个问题,我希望将j
映射到gj
以进行常规移动,但在给定count
时,其行为与常规j
类似。我在vimrc
中尝试了以下命令:
" Up and down now don't skip line-wraps unless given count
fun! MoveLines( lines, type )
if ( a:lines == 1 )
let a:str = 'g' . a:type
else
let a:str = a:lines . a:type
endif
call feedkeys( a:str )
endfun
nnoremap <silent> j :<C-U>call MoveLines( v:count1, 'j' )<CR>
当我只按j
时,这很好。问题是当我试图给它一个计数时:它递归地调用自己(正如预期的那样)。我可以尝试使用cursor
,但没有这种方法可以做到吗?
当没有给定计数时,我如何有条件地将j
映射为gj
,而当给定计数时却像正常人一样操作?
您可以使用v:count
来获得给定的当前计数。如果未提供任何内容,则将其设置为零。
nnoremap <expr> j v:count == 0 ? 'gj' : 'j'
有关更多帮助,请参阅:
:h v:count
:h :map-<expr>