2010-11-23 71 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擦除計數。