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

时间:2016-05-12 19:41:46

标签: vim

我将列号设置为相对模式,因为我不喜欢。 我还有nnoremap ped jgj,因此使用换行符更容易。问题是,当我在一条被包裹的线上做一个动作(比如2j)时,它不会向上移动两行,而是两条“线”。

为了解决这个问题,我希望j映射到gj进行常规移动,但在给定j时就像常规count一样。我在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,但在给出计数时却表现正常?

1 个答案:

答案 0 :(得分:3)

您可以使用v:count来获取当前计数。如果没有提供任何内容,则将其设置为零。

nnoremap <expr> j v:count == 0 ? 'gj' : 'j'

如需更多帮助,请参阅:

:h v:count
:h :map-<expr>