当我使用VIM突出显示文本并运行诸如"+y
或"*y
之类的命令,然后尝试将其粘贴到Windows中时,我同样使用ZOC,也使用Windows CMD。本地编辑器,输出为空白,这使我想到,突出显示的文本尚未通过SSH连接复制/传递到系统剪贴板...
类似地,"+p
不会从系统剪贴板中粘贴剪贴板内容。
系统信息:
pi@readonly:~/new$ vi --version | grep IMproved
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Sep 30 2017 18:21:38)
pi@readonly:~/new$ vim --version | grep clipboard
+clipboard +job +path_extra +user_commands
+eval +mouse_dec +statusline +xterm_clipboard
pi@readonly:~/new$
当我在VIM中打开任何文件并尝试检查寄存器+
时,我得到的是:
:reg +
--- Registers ---
Press ENTER or type command to continue
另外,当我运行:echo has('clipboard')
时,我得到1
@PatrickBacon,我通过单击v
,滚动浏览文本并使用"+y
来突出显示突出显示的文本。这是显示的寄存器:
:reg
--- Registers ---
"" int c;^J for (i = 0; i < sizeof(s) - 1 && (c = getchar()) != EOF;) {^J s[i++] = c;^J if (c == '\n
"0 int c;^J for (i = 0; i < sizeof(s) - 1 && (c = getchar()) != EOF;) {^J s[i++] = c;^J if (c == '\n
"1 ^J
"2 ^J
"3 p^J
"4 ^J
"5 ^J
"6 p^J
"7 p^J
"8 char s[64];^J size_t i;^J
"9 int atoi(const char *s) {^J int n = 0;^J size_t i = 0;^J^J while (s[i] == '0')^J i++;^J if (s[i]
"r while (s[i] >= '0' && s[i] <= '9')^J n = 10 * n + (s[i++] - '0');^J
"u size_t i = 0;^J^J while (s[i] == '0')^J i++;^J if (s[i] >= '1' && s[i] <= '9') {^J n = s[i++
"z t main() {^J char s[64];^J size_t i;^J int c;^J
"- i
"% t.c
Press ENTER or type command to continue
因此,看起来好像在vim中起作用了。
问题:
1)我还要检查什么来验证是否满足“将VIM文本中突出显示的内容复制到远程系统剪贴板中”的所有要求?
2)VIM中是否存在寄存器,我的Linux中某些目录中的真实文件是否已缓冲?
3)我通过SSH连接到的Linux系统的远程系统剪贴板如何?换句话说,远程系统剪贴板是Linux上的STDOUT文件还是它的一部分?
答案 0 :(得分:0)
通常,您不能通过SSH将文本从远程系统程序本地复制到当前系统。例外是,当您在本地计算机上运行X11服务器,并且远程系统运行X11兼容客户端时,并且您为SSH连接启用了X转发。由于您使用的是Windows,因此我怀疑您是在本地系统上运行X11服务器。
剪贴板是您正在使用的任何窗口系统的功能,并且Windows和X11(典型的Linux窗口系统)不共享兼容的界面。 X11剪贴板(有多个)存储在程序的内存中,直到X服务器使用剪贴板数据与程序对话并要求特定剪贴板中的数据为止。这些数据不仅是标准输出。这是专用的内存块和特定的协议。
如果您希望能够从远程终端复制文本块,最简单的方法是在本地系统上使用tmux之类的东西,然后通过tmux连接到远程系统。您可以配置tmux以使用快捷键将数据从终端复制并粘贴到剪贴板。这将导致一种配置适用于所有在tmux中运行的终端程序和连接,而不仅仅是Vim。
例如,您可以使用如下所示的键绑定(绑定到y
)来自动复制并粘贴到Windows剪贴板:
bind-key -T copy-mode-vi y send -X copy-pipe 'clip'