![Vim - 視覺模式 - 改進單字選擇](https://rvso.com/image/1399997/Vim%20-%20%E8%A6%96%E8%A6%BA%E6%A8%A1%E5%BC%8F%20-%20%E6%94%B9%E9%80%B2%E5%96%AE%E5%AD%97%E9%81%B8%E6%93%87.png)
先生/女士們,
我不明白為什麼當我在視覺模式(.vimrc)上觸發下面的快捷方式時,vim 表現出以下行為:
vmap <script> <C-LEFT> :call Test()<CR>
function! Test()
"empty
endfunction
Vim 前往 I 觸發捷徑的行上方的第一列,並在狀態列中顯示以下「: '<,'> call Test ()」。但這僅在我調用函數時發生,當我使用“$”(參見 *)之類的命令時,行為是預期的。
(*)
vmap <C-LEFT> $
我的目標是當我使用“Ctrl+Left”組合時,讓Vim 將“tab”視為一個單詞,因為當該行的第一個字元是“tab”時,Vim 選擇頂行中的第一個單字。
這是期望的行為:
如果您有任何替代解決方案或解決方法,我也將不勝感激。
謝謝!
答案1
vmap
當 vim 處於可視或選擇模式時適用。您沒有說明觸發地圖時選擇了什麼文字。
令人驚訝的行為可能是由於
:'<,'>
當您使用從 Visual 模式切換到 Ex 模式時自動提供的範圍:。也是使用者定義函數預設處理範圍的方式。
也就是說,我希望遊標結束於視覺選擇的最後一行。我無法重現您所描述的行為。
:help :call
:help '<
:help v_:
答案2
這是因為 是:call
透過自動新增的可視範圍來呼叫的'<,'>
。:help :call
解釋:
當給定範圍且函數本身不處理它時,將為該範圍中的每一行執行該函數,並將遊標置於該行的第一列。遊標留在最後一行(可能被最後一個函數呼叫移動)。
所以你要嘛需要清除範圍
vmap <script> <C-LEFT> :<C-u>call Test()<CR>
或讓函數處理它:
function! Test() range
答案3
我透過使用以下方法「解決」了這個問題:
" Note: "Normal" movement with "Ctrl+Right"! By Questor
nmap <silent> <C-Right> e
imap <silent> <C-Right> <C-o>e<Right>
vmap <silent> <C-Right> e
" Note: "Normal" movement with "Ctrl+Left"! By Questor
nmap <silent> <C-Left> b
imap <silent> <C-Left> <C-o>b
vmap <silent> <C-Left> b
但請注意,我不使用函數。如果使用了某個函數,我需要按照 Ingo Karkat 在他的回復中解釋的那樣繼續(使用: <C-u>
)。
透過這種簡單的方法,我「修復」了上面解釋的 Vim 的不良行為。
請參閱使用範例https://github.com/eduardolucioac/groovim/blob/master/.vimrc
[]的