2010-11-23 54 views
4

例如丢弃计,我有以下表达式映射: <expr>中映射

 
    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语句光标将是),那么这种尝试去 235列,取代它,因为这会从 2s转换为 2{DelNthSpace()}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和一些其他国家之间同样的关系),其它的是运动。由于这些函数定义了运动,所以我不能使用:<C-u>,它会离开视觉模式(或者我将不得不添加一个黑客,它会告诉哪个模式函数被调用)。我不知道这个黑客,我无法为正常和可视模式定义不同的映射。

+0

我upvoting因为标题问什么,我需要我自己,但很难通过文字来获得,我也不清楚,如果给人一种非常特殊的应用程序的所有细节是必要的。 – Alexey 2015-03-03 12:59:53

+0

我有一个相关的问题:例如,如果您已在Vim中以可视模式输入一个计数,但后来认为计数错误或不必要,那么如何在不离开Visual模式的情况下取消计数? – Alexey 2015-03-03 13:02:10

回答

2

有没有办法让VIM忽略了<expr>映射计数,但是你可以很容易地改变你的映射,使你的函数工作:

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

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