![Vim - 视觉模式 - 改进单词选择](https://linux22.com/image/1399997/Vim%20-%20%E8%A7%86%E8%A7%89%E6%A8%A1%E5%BC%8F%20-%20%E6%94%B9%E8%BF%9B%E5%8D%95%E8%AF%8D%E9%80%89%E6%8B%A9.png)
先生们/女士们,
我不明白为什么当我在可视模式(.vimrc)上触发下面的快捷方式时,vim 会表现出以下行为:
vmap <script> <C-LEFT> :call Test()<CR>
function! Test()
"empty
endfunction
Vim 转到我触发快捷键的行上方的行的第一列,并在状态栏中显示以下内容“:'<,'> call Test ()”。但这仅在我调用函数时发生,当我使用“$”之类的命令时(参见 *),行为是预期的。
(*)
vmap <C-LEFT> $
我的目标是当我使用“Ctrl + Left”组合键时让 Vim 将“tab”视为一个单词,因为当行的第一个字符是“tab”时,Vim 会选择顶行中的第一个单词。
这是期望的行为:
如果您有任何其他解决方案或解决方法,我将不胜感激。
谢谢!
答案1
当 vim 处于 Visual 或 Select 模式时适用vmap
。您没有说明触发地图时选择了什么文本。
这种令人惊讶的行为可能是由于
:'<,'>
使用 从 Visual 模式切换到 Ex 模式时自动提供的范围:。用户定义函数默认处理范围的方式也是如此。
也就是说,我希望光标结束在 Visual 选择的最后一行。我无法重现您描述的行为。
: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
[]的