2013-07-18 74 views
0

我想寫一個插件,涉及向上或向下移動可變數量的行。我想創建一些可以用作自定義運動的東西,以用於常規,可視化和運營商待定模式。在視覺模式中造成這種奇怪的運動行爲是什麼?

這裏的想法的一個小片段:(「3」以下是該示例的目標是將可變數量的線,但是這是不相關的我的問題是什麼。)

function! MoveDownThreeLines(mode) 
    if a:mode == 'v' 
     normal! gv 
    endif 

    if a:mode == 'o' 
     normal! V3j 
    else 
     normal! 3j 
    endif 
endfunction 

nnoremap w :call MoveDownThreeLines('n')<CR> 
vnoremap w :call MoveDownThreeLines('v')<CR> 
onoremap w :call MoveDownThreeLines('o')<CR> 

這個片段的目標是創建一個向下移動三行的自定義動作。然後,我想要w的行爲與3j的行爲相同。在正常模式下,它像預期的那樣向下移動三條線,並且在操作員待定模式中,操作員按預期行動四條線(當前和下面三條線)。 (雖然我不得不使用V來強制運動,這很奇怪,因爲j已經是一個線性運動了。有沒有人知道這是爲什麼?)

問題出在視覺模式。如果我進入可視模式,請按w,光標向下移動三行,如預期。但是,如果我再次按w,它只能向下移動兩行。

同樣,如果我進入視覺模式並以某種其他方式向下延伸選擇,則按w只能向下移動兩行。另一個奇怪的問題是,如果我進入可視模式並向上擴展選擇,w將我的選擇從舊選擇的底部改變爲兩行。 (目標是w將選區的頂部向下移動三行,就像我使用3j一樣。)

如何在所有情況下使w向下移動三行?

PS:Ingo Karkat,如果你碰巧讀到這個,感謝你的評論頗高的camelcasemotion腳本 - 這需要一些想法。

+2

這是一個好的做法,加上''來清除視覺範圍'<,'>'的一部分。 'vnoremap w: call MoveDownThreeLines('v')' –

+0

'gv'在每次執行時將光標向上移動,除了第一次執行。 – FDinoff

+0

@PeterRincker對,我忘記了!對於稍後閱讀這些內容的人來說,這不僅僅是良好的做法,它還會在執行方面產生影響。這就是這裏的錯誤。感謝您指出了這一點!如果你想發佈這個答案,我會去接受它。 – pandubear

回答

3

您應該預先所有(不只是視覺的方式之一,彼得Rincker評論)映射與<C-u>,因爲你可能要提供與您的映射一個[count](而不是硬編碼3)。

在正常模式下,當按下:時,計數(例如3)被翻譯成:.,+2。同樣,視覺模式:預先:'<,'>:call命令爲每行執行一次函數,這通常不是您想要的。 (您可以通過附加range關鍵字到:function定義,但避免計數被轉換成一個範圍,您可以使用它更加靈活地改變,你可以用v:count使用它自己的函數中。)

+0

對,謝謝。這就說得通了。但是,爲什麼你應該用''作爲前綴映射操作符呢? – pandubear

+0

您不需要,因爲即時計數沒有正常模式的行爲,但我不知道這是錯誤還是意圖。最好保持一致,因爲它肯定不會受到傷害。 –

+0

+1關於'' –

相關問題