例如,我有以下表达式映射: <删除> 德尔>
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,我不能为正常和可视模式定义不同的映射。
答案 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
将无效