【问题标题】:Unable to get vim copy highlighted text to the system clipboard, not vim's clipboard无法获取 vim 将突出显示的文本复制到系统剪贴板,而不是 vim 的剪贴板
【发布时间】:2019-01-17 20:42:32
【问题描述】:

我正在使用 ZOC,也使用 Windows CMD,同样的事情,当我使用 VIM 突出显示文本并运行 "+y"*y 之类的命令,然后尝试粘贴到我的 Windows 本地编辑器中时,输出为空白,这让我想到,突出显示的文本没有通过 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 

因此,看起来 yanking 正在 vim 中工作..

问题:

1) 我还应该检查什么来验证“将 VIM 文本中突出显示的内容复制到远程系统剪贴板”的所有要求都已满足?

2) VIM 中存在的寄存器,我的 Linux 中某些目录中的真实文件是否已缓冲?

3) 远程系统剪贴板在我通过 SSH 连接的 Linux 系统中看起来如何?换句话说,远程系统剪贴板是简单的 STDOUT 文件还是它的一部分,在 Linux 上?

【问题讨论】:

  • 2) Vim 中存在的寄存器是真实的文件 不,它们是内存缓冲区。
  • 如果你使用的是 linux 你必须使用 vim-gtk 才能复制到剪贴板,这里都有解释 (stackoverflow.com/questions/3961859/…)
  • 3) 远程系统剪贴板在我通过 SSH 连接的 Linux 系统中看起来如何? 在 Unix 中没有 system clipboard 这样的东西/Linux。 X Windows 中有剪贴板和复制缓冲区。
  • @phd “内存缓冲区”是什么意思?换句话说,您的意思是,VIM 本身在运行时消耗了一些 RAM,并且文件存储在其中,还是扩展...?
  • 是的,正是如此。

标签: windows vim ssh raspberry-pi clipboard


【解决方案1】:

一般来说,您不能通过 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'

【讨论】:

  • 我已经安装了 tmux 并将其设置在 .tmux.conf 中,但是,当使用 VIM 复制时,特别是使用 v 并进行选择,然后按 y,返回我的操作系统,什么都没有可以粘贴到记事本...有什么想法吗?
  • 如果使用 tmux 进行复制和粘贴,则不能使用 Vim 键绑定;相反,您需要使用 tmux 进行复制和粘贴。除非您使用 X 转发,否则无法通过 SSH 实现 Vim 键绑定。
  • 那么,我仍然可以使用 vim 作为编辑器,但是,根据 tmux 设置,使用组合键在其中复制行吗?如果是,我应该根据“bind-key -T copy-mode-vi y send -X copy-pipe 'clip'”使用哪个组合?
  • 根据该示例,您将按 tmux 键(默认为 Ctrl-B),然后按 [ 进入复制模式,然后选择要复制的区域,然后按 y 即可复制。如果您对 tmux 使用 emacs 模式而不是 vi 模式,请将绑定更改为使用 copy-mode 而不是 copy-mode-vi
  • 对不起,我不清楚,首先我连接远程机器,输入tmux并输入vim t.c,然后按ctrl+b,然后[,我是在底部和右侧得到[0] 0:[tmux]* "readonly" 08:46 27-Jan-19 行:`[0/36]'。但是现在,我可以使用哪种组合来选择实际文本并复制到远程“Windows”剪贴板?
猜你喜欢
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多