停止vim将选择内容粘贴为文本!


10

我已经使用VI和VIM多年了(30年或更长时间)(在xterm中,不是它自己的窗口,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工作:例如,文本/数据文件的批量重新格式化。

问题...

在我的上一个系统补丁(Fedora 25)中,vim现在将鼠标选择粘贴为TEXT而不是vim命令,我似乎无法停止!

在其他系统(Fedora 24)上仍然可以正常工作。

如果要粘贴为文本,请在粘贴前进入插入模式!我不希望VIM不在插入模式下时自动将所选内容AS文本粘贴。我知道这是安全功能,但是对我来说这是一个重要的可用性问题。

我已经尝试从不执行此操作的机器上回溯约会terminfo条目(xterm-256color)(尤其是“ kmous” terminfo条目)。我也看过了vim“:set mouse =”设置(这是null!)。我不知道这是xterm(可疑),还是VIM中发生了更改(可能有更改),并且更改日志和google一直无济于事。

但是,似乎什么也没让我过时。


发现同样的问题的另一个用户,较少的细节,没有解决方案unix.stackexchange.com/questions/346293/...
安东尼

1
我怀疑它更可能一个vim变化:如何vim内的xterm知道的东西是通过键盘输入或者通过鼠标右键粘贴?我不知道这种机制。另一方面,xterm知道它正在执行,vim因此可以决定使用i<esc> 包围粘贴。尝试(a)使用其他类型的终端窗口,以及(b)vim使用其他名称的副本。这应该有助于缩小问题的原因。
Philippos

我同意@philippos。也许除了vim劫持您的粘贴方法外,还有其他事情。也许尝试将ssh's或telnet到您的计算机中并以这种方式粘贴。如果您有Windows框,请使用腻子将其SSH到Fedora25机器中,然后粘贴。
Jim U

没有直接关系,但是Windows上的gvim多年来一直以这种方式运行。安装gvim时,您将获得两个可执行文件gvim.exe(graphical-vim)和命令行vim.exe。在gvim.exe中粘贴“ itext”,您会得到itext。将其粘贴到vim.exe中,您将得到text
Jim U

1
@Philippos该机制可以放在方括号内。我不知道Vim将如何支持它,也许是pastetoggle选项?
吉尔斯(Gillles)'所以

Answers:


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=

替代解决方案...

在命令或普通模式下,当vim看到(从鼠标中)终端粘贴的开始顺序时,不要完全停止使括号生效。

:nmap <PasteStart>  <NOP>
:nmap <PasteEnd>    <NOP>
:cmap <PasteStart>  <NOP>
:cmap <PasteEnd>    <NOP>

使用它意味着,如果在插入模式下粘贴文本,vim将不会尝试格式化(缩进)比已经缩进的文本更多的文本。

这并不意味着我不再需要切换粘贴模式,因为我还使用了粘贴模式切换(映射到F2)来禁用“ showbreak”和“ listchars”(显示换行,制表符,不间断空格和行尾的多余空格)。当我要选择鼠标粘贴到其他位置时,仍然需要将vim置于该模式。

欢迎对解决方案提出意见和建议。


这似乎也可以在Cygwin Vm中使用,但可悲的是不能解决VS Vim中的问题
James Robinson

@JamesRobinson很可能是VS的另一个内置终端
安东尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.