丢弃<expr>映射中的计数</expr>

时间:2010-11-23 21:33:36

标签: vim mapping keyboard-shortcuts

例如,我有以下表达式映射: <删除>

    function! DelNthSpace()
        let col=match(getline('.'), '[[:blank:] ]', col('.'), v:count1)
        return virtcol([line('.'), col+1])."|s \e"
    endfunction
    nnoremap  s DelNthSpace()
你看,这里已经处理了v:count1。但是,如果我尝试用例如位于虚拟列35的函数替换第二个空格(如果将光标放在return语句上,那么它将会转到列{{1并替换它,因为它会从235转换为2s - &gt; 2{DelNthSpace()}。现在我在return语句的开头处使用了无用的235|s ^[,它消耗了不必要的计数,但是我不喜欢这个解决方案,因为它使用两个移动而不是一个。

更新:我应该提供更多背景信息:

|

有许多函数正在使用这些函数,一个模仿替换命令,但是音译它的参数(因此,在调用function! ToNthSpace() let col=match(getline('.'), '[[:blank:] ]', col('.'), v:count1) return virtcol([line('.'), col+1])."|" endfunction noremap <expr> s ToNthSpace() 时将用r$ii替换字符并插入$i将替换为\tr$ii的字符,t之间的相同关系以及其他一些字符),其他是动议。由于这些函数定义了运动,我不能使用\tt,它将离开可视模式(或者我将不得不添加一个黑客,它将告诉哪个模式函数被调用)。我不知道这个hack,我不能为正常和可视模式定义不同的映射。

2 个答案:

答案 0 :(得分:2)

无法让vim忽略<expr>映射的计数,但是您可以轻松更改映射以使您的函数正常工作:

nnoremap s :<C-U>exe 'normal!' DelNthSpace()<CR>

有关使用:help v:count删除计数的信息,请参阅CTRL+U

答案 1 :(得分:0)

要总结@Alexey提到的内容以及我在operator-pending模式下的测试,您可以执行以下操作

nnoremap <expr> s "@_" . ToNthSpace()
vnoremap <expr> s "@_" . ToNthSpace()
onoremap <expr> s printf(":normal %s\<cr>", ToNthSpace())

然后您示例中已输入的2将无效