使用 gVim 的虚拟编辑实现更好的鼠标点击行为

使用 gVim 的虚拟编辑实现更好的鼠标点击行为

我喜欢使用 Vim 的 virtualedit=all 功能,但我也喜欢能够在行末单击并让光标直接移至行末(而不是移至我单击的确切位置)。是否有插件或其他东西可以使 Vim 在鼠标单击后更智能地放置光标?理想情况下,我希望它执行以下任一操作:

  • 忽略鼠标单击时的虚拟编辑偏好:当鼠标单击时,如果单击发生在行最后一个字符之后,无论虚拟编辑是否打开,Vim 都会将光标定位在行末。
  • 模式相关的鼠标点击行为:在正常模式下,在行末单击鼠标会导致光标跳转到最后一个字符;在插入模式下,光标位于鼠标下方。
  • MS-Word 样式行为(首选):单击时光标跳至行尾,双击时跳至虚拟编辑位置

我知道我可以从 virtualedit-all 切换到 virtualedit-block,但我更喜欢 virtualedit=all,除了鼠标单击行为之外。(实际上,我甚至喜欢能够使用鼠标单击将光标定位在制表符的中间,因此这实际上只是在一行中的最后一个字符后单击的行为。)

PS 请不要发表任何评论或回答,暗示我只是教自己不要使用鼠标。使用鼠标是我从 Vim 切换到 gVim 的原因之一,因为坦率地说,有时它非常方便,即使你在文件中移动的主要方法是仅使用键盘。

编辑:添加了与模式相关的想法。

答案1

鼠标点击就像 Vim 中的按键一样可以映射。因此,您可以重新映射鼠标点击以根​​据需要设置虚拟编辑,然后执行鼠标点击,再将其设置回去。

插入模式比我现在想尝试的要复杂得多,但正常模式很容易。类似这样的操作应该可以工作,尽管保存和恢复虚拟编辑比明确设置它会更好:

nnoremap <silent> <LeftMouse> :set virtualedit=<CR><LeftMouse>:set virtualedit=all<CR>

也可以用类似的方式重新映射双击,使用<2-LeftMouse>而不是<LeftMouse>。一些实验表明这可能不需要。但由于默认情况下双击会让您进入可视选择模式,您可能需要如下映射:

nnoremap <silent> <2-LeftMouse> <LeftMouse>

然而,我实际上无法让它工作。即使应用了该映射和几个类似的映射,我还是搞不清楚如何让它不进入视觉模式。


编辑(由OP;我想在这里发布我的“最终”解决方案,以便其他人可以看到它,但我不想发布单独的答案,因为这个答案确实是我需要的):

以下是我最终投入的内容.vimrc

function! TempNonVirtual()
    let g:oldvirtualedit=&virtualedit
    set virtualedit=
endfunction
function! RestoreVirtual()
    let &virtualedit=g:oldvirtualedit
endfunction
set virtualedit=all
nnoremap <silent> <LeftMouse> :call TempNonVirtual()<CR><LeftMouse>:call RestoreVirtual()<CR> 

我想将这两个函数合并为一个名为的函数NonVirtualClick,或者可以保存旧的虚拟编辑设置、执行单击,然后恢复设置,但它<LeftMouse>不是命令,因此它在函数内部不起作用。(欢迎提供有关如何解决这个问题的提示...)

相关内容