我想寫一個插件,涉及向上或向下移動可變數量的行。我想創建一些可以用作自定義運動的東西,以用於常規,可視化和運營商待定模式。在視覺模式中造成這種奇怪的運動行爲是什麼?
這裏的想法的一個小片段:(「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腳本 - 這需要一些想法。
這是一個好的做法,加上''來清除視覺範圍'<,'>'的一部分。 'vnoremap w: call MoveDownThreeLines('v')' –
'gv'在每次執行時將光標向上移動,除了第一次執行。 – FDinoff
@PeterRincker對,我忘記了!對於稍後閱讀這些內容的人來說,這不僅僅是良好的做法,它還會在執行方面產生影響。這就是這裏的錯誤。感謝您指出了這一點!如果你想發佈這個答案,我會去接受它。 – pandubear