Vim-根据上下文映射备用密钥行为



我将列编号设置为相对模式,因为我喜欢不计数。我还将nnoremapj添加到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>

最新更新