我已经使用 VI 和 VIM 多年(30 年或更长时间)(在 xterms 中,而不是它自己的窗口,gvim)并且我有一个巨大的 vim命令库,我使用鼠标中键作为选择给 vim。
例如,我经常会做这样的事情......
vi {many_hundreds_of_files}
paste vim commands using mouse - one paste per file.
Run Code Online (Sandbox Code Playgroud)
选择将包括许多 VIM 命令来执行诸如替换测试、格式化、移动行等等操作,并且通常以 :w 和 :next VIM 命令结尾,在选择的末尾,所以 vim 准备好让我再次粘贴到下一个文件中。这让我可以以非常复杂的方式更新大量文件,而无需特殊脚本(例如 perl 就地编辑)来执行此操作。
其中一些 vim 命令粘贴长达 200 多行(存储在我在屏幕上弹出的文本文件中,以及“全部复制”!这些对我正在重新格式化的数千个文件集进行了大量更改。但是仅适用于特定的文件集,不适用于我的日常 vim 工作。例如:批量重新格式化文本/数据文件。
问题...
在我的上一个系统补丁 (Fedora 25) 中,vim 现在将鼠标选择粘贴为文本而不是 vim 命令,我似乎无法阻止它!
它在另一个系统(Fedora 24)上仍然可以正常工作。
如果我想粘贴为文本,我在粘贴之前进入插入模式!我不希望 VIM 在不处于插入模式时自动将选择粘贴为文本。我知道这是作为一项安全功能,但对我来说这是一个主要的可用性问题。
我曾尝试从一台不这样做的机器(尤其是“kmous”terminfo 条目)上回溯对 terminfo 条目(xterm-256color)的约会。我还查看了 vim ":set mouse=" 设置(这是空的!)。我不知道是 xterm(可疑)还是 VIM 中发生了变化(可能),更改日志和 google 都没有帮助。
然而,似乎没有什么能让我保持旧的行为。
ant*_*ony 12
在浏览了很多网页后,许多网页给出了一些似乎不起作用的提示,我发现了一个提示(粘贴周围的额外文本),可以引导我找到问题的原因和解决方案。
似乎 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=
Run Code Online (Sandbox Code Playgroud)
替代解决方案....
在命令或正常模式下,当 vim 看到终端粘贴的开始序列(来自鼠标)时,不要完全禁用括号粘贴,而是停止执行操作。
:nmap <PasteStart> <NOP>
:nmap <PasteEnd> <NOP>
:cmap <PasteStart> <NOP>
:cmap <PasteEnd> <NOP>
Run Code Online (Sandbox Code Playgroud)
使用这意味着如果您在插入模式下粘贴文本,vim 将不会尝试格式化(缩进)很可能已经缩进的文本。
这并不意味着我不再需要切换粘贴模式,因为我还使用粘贴模式切换(映射到 F2)来禁用“showbreak”和“listchars”(显示换行、制表符、不间断空格和行尾的额外空格)。当我想将鼠标选择粘贴到其他地方时,我仍然需要将 vim 置于该模式。
欢迎对解决方案提出意见和建议。