Vim - 视觉模式 - 改进单词选择

Vim - 视觉模式 - 改进单词选择

先生们/女士们,

我不明白为什么当我在可视模式(.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

[]的

相关内容