我在将文本从终端中的 vim 复制粘贴到 FF 浏览器(使用 Vimperator)中的 Google Docs(又名 Drive)文档(以下简称 GDd)时遇到了一些问题。
笔记:
- 我在终端中使用 Vim 7.2 打开了一个文件
:version
同时显示+clipboard
和+xterm-clipboard
- 我使用的是 Ubuntu 10.04 LTS,所以我不认为这与 Unity 有关
- 我想使用 Vim,而不是 GVim,也不是 gedit...
- 我是无鼠标导航的狂热粉丝,所以使用鼠标的解决方案不是我想要的。
- 我有解决方案,但我需要理解。
我尝试过的方法以及效果如下:
- 通过以下方式提取整个文件文本:
ggvGy
允许我:- 通过粘贴鼠标中键,不与
Ctrl+v
或Shift+Insert
- 此处,在用于输入问题文本的文本区域中
- 在 gedit 中
- 但在我想要粘贴的 GDd 中却不行,即使我将 Vimperator 切换到直通模式
Insert
- 之后在 XClip 中不显示
xclip -o
- 从 gedit,我可以将文本复制粘贴到 GDd 中(不需要 Vimperator 的直通模式)。
- 通过粘贴鼠标中键,不与
:%! !xclip -i
(或者:first, last
)- 报告整个文件(准确地说是所有行)已过滤,但 shell 返回 1
- `xclip -o' 不返回任何内容(为空)或返回先前复制的值
- 2. 毫不奇怪,我根本无法粘贴到 GDd,也无法粘贴到 gedit 或这里
- 将剪贴板(
:set clipboard=unnamed
)设置为未命名没有帮助 - 使用
"+y
或"*y
对整个文件文本实际上可以解决问题
因此,问题是(实际上有三个,说“分裂”我就会):
- 为什么鼠标中键粘贴的内容与 Ctrl+v 粘贴的内容不同,以及如何知道每个按钮粘贴的内容是什么?
- 为什么仅使用鼠标进行拖动(不使用寄存器)就可以,而使用键盘/XClip 却不行?
- 为什么未命名的寄存器没有帮助?设置后应该
unnamed
和*
寄存器相同吗?
答案1
Linux 有两个剪贴板(称为“主缓冲区”和“辅助缓冲区”)。一个用于鼠标复制/粘贴,另一个用于 Ctrl-C/Ctrl-V。因此,如果您选择某些内容(例如,为了删除它),使用 Ctrl-C 放入剪贴板的内容仍然完好无损。
如果您想复制而不拉动,请尝试选择要复制的文本,然后按 CTRL+SHIFT+C,然后按 CTRL+SHIFT+V 进行复制/粘贴
我希望这会有所帮助
答案2
默认情况下,只有当您进行视觉选择(使用 v,或者等效地使用鼠标)时,剪贴板才会被填充。(在下文中,我们讨论的是“旧”X 剪贴板,即主缓冲区)。要使用“y”影响剪贴板(即使没有视觉选择),您需要:set clipboard=unnamed
。我不知道为什么在您的第一个示例中,xclip -o 没有显示任何内容;它应该显示。但是,我对此有一个假设,请参见下文。
我有 10.04。我启动 vim。
:set clipboard
clipboard=autoselect,exclude:cons\|linux
我随意输入了一些文字:
asd fa sdf
asdf
现在我明白了ggVGy
。在另一个终端窗口中,我输入
xclip -o
xclip 正确地显示了文件的内容。我可以用鼠标中键将其粘贴到任何地方,例如这里:
asd fa sdf
asdf
如果我只是用“v”开始视觉选择,四处移动,然后用“y”拉出,结果也是一样。但是,如果我执行“yy”(拉出当前行,而不进行视觉选择),剪贴板不会更新。
好的,现在我知道了
:set clipboard=unnamed
我这样做了ggyy
(转到第一行,不使用视觉选择,将其复制到未命名的寄存器)。现在 xclip -o 显示“asd fa sdf”,我可以用鼠标中键粘贴它;X 剪贴板已使用 yank 命令填充。
结论
无需修改 vimperator,它在我的系统上就能正常工作。请重复上述操作(不使用 vimperator,见下文)以确保执行此操作时ggVGy
显示xclip -o
内容(与您的示例不同)。
我的假设是,vimperator 由于某种原因重置了 X 剪贴板。尝试将常规 vim 会话与 vimperator 分开:
如果您使用鼠标(左键,不按 Ctrl-Shift-C)在终端中选择某个内容,您可以使用中键将其粘贴到 vimperator 中吗?
如果您使用 vi 直观地选择某些内容,您是否可以在 gedit 中使用鼠标中键粘贴它(显然您可以)和用 可以看到它
xclip -o
(您说您看不到,但是我不相信 :-);否则,鼠标中键将不起作用)?