我已经使用 VI 和 VIM 多年了(30 或更多)(在 xterms 中,而不是它自己的窗口,gvim)并且我有一个巨大的 vim 库命令我给 vim 使用鼠标中键作为选择。
例如,我经常做这样的事情......
vi {many_hundreds_of_files}
paste vim commands using mouse - one paste per file.
选择将包括许多 VIM 命令来执行诸如替换测试、格式化、移动行等操作等操作,并且通常在选择结束时以 :w 和 :next VIM 命令结尾,所以 vim 已准备好让我再次粘贴到下一个文件中。这让我能够以非常复杂的方式更新大量文件,而不需要特殊的脚本(例如 perl 就地编辑)来完成它。
其中一些 vim 命令粘贴长达 200 多行(存储在我在屏幕上弹出的文本文件中,并且“复制全部”!这些对我正在重新格式化的数千个文件集进行了大量更改。但是仅适用于特定的文件集,不适用于我的日常 vim 工作 EG:文本/数据文件的批量重新格式化。
问题...
在我上一个系统补丁(Fedora 25)期间,vim 现在将鼠标选择粘贴为文本而不是 vim 命令,我似乎无法阻止它!
它在另一个系统(Fedora 24)上仍然可以正常工作。
如果我想粘贴为文本,我会在粘贴之前进入插入模式!我不希望 VIM 在不处于插入模式时自动将选择内容粘贴为文本。我知道这是一项安全功能,但对我来说这是一个主要的可用性问题。
我尝试从不执行此操作的计算机(尤其是“kmous”terminfo 条目)中回溯约会 terminfo 条目(xterm-256color)。我还查看了 vim ":set mouse=" 设置(为空!)。我不知道这是否是 xterm(值得怀疑),或者是 VIM 中发生的更改(可能),并且更改日志和 google 没有帮助。
然而,似乎没有什么能让我恢复原来的行为。
答案1
在浏览了很多网页之后,许多网页给出了一些似乎不起作用的提示,我发现了一个提示(粘贴周围的额外文本),它引导我找到问题的原因和解决方案。
vim 似乎内置了许多“假”termcap 条目,当它识别特定终端时会使用这些条目(有时会出错,尽管在本例中并没有错)。
vim 中的 Termcap 设置有很多添加,因此不会显示在正常的“:set all”设置列表中。要查看它们,您需要使用“:set termcap”。具体的“非标准”termcap 设置是“t_BE”(请参阅 vim“:help t_BE”)。内置帮助“xterm-bracketed-paste”解释了这个 vim 内部的 termcap 设置。
基本上,如果定义了此设置(在本例中是由 Vim 定义的,而不是 termcap/terminfo),则 vim 会在启动时将其发送到 xterm,这会告诉 xterm 在用户从外部源粘贴的任何文本周围添加特殊代码。当 vim 看到这些时,它不仅会自动进入插入模式,还会设置“粘贴模式”,以免格式化文本。
我认为后者(粘贴模式)非常有用!前者一直给我带来麻烦。
强力解决方案是通过将其添加到“.vimrc”来禁用括号粘贴
:set t_BE=
替代解决方案....
不要完全禁用括号粘贴,而是在命令或正常模式下看到终端粘贴的起始序列(从鼠标)时停止 vim 采取操作。
:nmap <PasteStart> <NOP>
:nmap <PasteEnd> <NOP>
:cmap <PasteStart> <NOP>
:cmap <PasteEnd> <NOP>
使用此意味着如果您在插入模式下粘贴文本,vim 将不会尝试格式化(缩进)很可能已经缩进的文本。
这并不意味着我不再需要切换粘贴模式,因为我还使用粘贴模式切换(映射到 F2)来禁用“showbreak”和“listchars”(显示换行、制表符、不间断空格和行尾有多余空格)。当我想用鼠标选择粘贴到其他地方时,我仍然需要将 vim 置于该模式。
欢迎对解决方案提出意见和建议。