无法将Vim复制突出显示的文本到系统剪贴板,而不是Vim的剪贴板

时间:2019-01-17 20:42:33

标签: windows vim ssh raspberry-pi clipboard

当我使用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文件还是它的一部分?

1 个答案:

答案 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'