【问题标题】:Ubuntu: How to copy text from terminal which is running vim on ssh, into local clipboardUbuntu:如何将文本从在 ssh 上运行 vim 的终端复制到本地剪贴板
【发布时间】:2020-04-14 01:30:03
【问题描述】:

有很多类似的问题,但没有一个有效的答案,而且它应该是微不足道的,因为它曾经是。

场景: 在 Ubuntu 桌面系统上,我正在运行一个终端,我通过 SSH 连接到远程服务器。通常,我可以用鼠标从终端(即“从”远程服务器)中选择文本,然后使用 CTRL+SHIFT+C 将其复制到本地(而不是像我一样使用 CTRL+C将在终端以外的任何应用程序中执行)并将选择复制到本地剪贴板,然后我可以将其粘贴到任何地方。这也将允许我使用 CTRL+SHIFT+V 将其粘贴到终端本身(或另一个),最终将其粘贴到远程服务器上运行的任何内容(包括 vim)。

这曾经在 在远程服务器上运行 vim 时也可以工作(在远程服务器上使用 debian 8),所以澄清一下:在我的本地 ubuntu 机器中是一个终端;在终端内,我通过 ssh 连接到远程服务器;在我正在运行 vim 的服务器上;所以在远程服务器上用 vim 打开的文件的内容在我本地机器的终端中是可见的。 Ctrl+Shift+C 曾经允许我将选择复制到本地计算机上的本地剪贴板,然后我可以将其粘贴到本地文本编辑器或回到远程计算机上的 vim。这样,我可以从远程 vim 复制粘贴到本地 gedit,反之亦然,或者从远程 vim 复制到远程 vim(通过我的本地剪贴板),或者从远程 vim 复制到另一个终端中的另一个远程 vim,无论是在同一台服务器上还是在另一台服务器上。我完全清楚远程服务器在这种情况下对复制和粘贴一无所知。本地系统只是复制它在终端中看到的文本(恰好是在远程机器上通过 ssh 运行的某些内容的输出),然后将其粘贴回终端(这导致它通过 ssh 进入远程机器)。我知道,它对我有用。

当涉及 vim 时,这不再起作用(在远程机器上使用 debian 10)。现在在远程服务器上我正在运行 Debian 10。只要在远程服务器上我 不运行 vim,Ctrl+Shift+C 仍然有效(复制到本地剪贴板)。例如,我可以使用 Ctrl+Shift+C 将文本从远程控制台复制到本地剪贴板。无论我是否在远程机器上的 vim 中,Ctrl+Shift+V 仍然有效。但是,当 vim 在终端中的远程计算机上打开时,Ctrl+Shift+C 不会复制到本地剪贴板。

我的猜测是 Ctrl+Shift+C 以某种方式被 vim 捕获。

那么,当这个终端碰巧正在运行 ssh 并且 vim 碰巧在远程机器上打开时,如何将文本从终端复制到 ubuntu 上的剪贴板?

我知道我可以使用y 来“复制”(即复制)和p 在 vi​​m 中远程粘贴。然而,这不是我要找的。这一切都是远程发生的,只允许我在远程机器上从 vim 复制到 vim(也许也从 vim 复制到远程机器上的其他东西,我不在乎)。这不允许我从远程机器上的 vim 复制到本地机器上的文本编辑器。

我不想要一个复杂的解决方案,包括从 vim“拉”到远程机器上的其他东西,然后 ftp 将文件传输到我的本地机器或其他东西。那是垃圾。我想LOCALLY COPY在终端本地看到的任何东西,尽管终端中运行的东西是通过远程机器上的ssh vim。

我以前已经能够做到这一点。我仍然可以使用运行 debian 8 的远程服务器。但不能在运行 debian 10 的远程服务器上。

我该怎么做?

【问题讨论】:

标签: ubuntu vim ssh debian


【解决方案1】:

你看到的实际上是 Vim 中:set mouse=a(或:set mouse=nvi)的结果,这意味着 Vim 会告诉终端它要捕获和处理鼠标事件,所以它们会转到远程 Vim而不是留在本地终端。

所以问题实际上并不是 CTRL+SHIFT+C 不起作用...而是它没有可复制的内容,因为终端中没有选择,因为鼠标事件是发送到远程 Vim,它使用它们来选择一个 Visual 块。

Debian 8 发布了 Vim 版本 7.4,而 Debian 10 发布了 Vim 8+,从 Vim 8 开始,发布了一个新的 defaults.vim,它在您没有 vimrc 文件时运行,并将自动设置 mouse=a(或 mouse=nvi) ,所以也许这就是您从中获取设置的地方?或者如果你确实有一个 vimrc 文件,也许 Debian 现在在系统 vimrc 文件中包含了这个设置,这就是它的来源......

您有几种方法可以解决此问题。一种是使用 :set mouse= 禁用 Vim 对鼠标的捕获,您可以在正在运行的 Vim 上执行它以确认它为您解决了问题,或者添加到您的 ~/.vimrc 文件中以使其永久化。 (如果您是第一次创建新的 vimrc 文件,请参阅 :help defaults.vim 中的说明以保留您一直使用的默认值!)

另一个选项是您的终端可能有一种方法来覆盖鼠标捕获并使用本地选择,即使在终端中运行的应用程序已经捕获了鼠标。这可能涉及在按住修饰键的同时进行选择,例如 ALTCTRL 或者可能是 SHIFT,以便终端知道您真正想要此特定操作的鼠标其他行为。终端使用的修饰键可能会有所不同,但其中之一可能会触发您想要的行为。这通常很容易分辨,因为终端中的鼠标选择在视觉上与 Vim 中的可视模式完全不同。一旦您使用覆盖完成了正常的鼠标选择,您就可以像以前一样使用 CTRL+SHIFT+C 复制文本。这种方法为您带来了两全其美的好处,因为您仍然可以在 Vim 中使用鼠标,但是当您真正想要复制和粘贴的选择时,您可以使用它。

【讨论】:

  • 太好了,谢谢!这解释了一切并且解决方案有效。我想我可能很高兴每次都在 vim 中做:set mouse=,如果我累了,我会把它放到~/.vimrc 中。感谢您的精彩、清晰和完整的回答!
【解决方案2】:

我在 Linux VPS-s 上使用 tty 终端多年。正如 filBranden 已经提到的,从“Gnome 终端”到 VPS 的 ssh 是首选解决方案。但在我设置 uwf 和 ssh 服务之前,我使用 tty 终端,没有鼠标和粘贴。我发现将以下别名添加到 .bashrc 的有用解决方案之一:

alias f='sudo find / -iname'
alias h='history'
alias hgrep='history | grep'
alias htail='history | tail -n'
alias s='sudo'
alias path='echo -e ${PATH//:/\\n}'
alias ..='cd ..'

所以,例如如果你输入hgrep sshd 输出将是:

43 秒服务 sshd 重启

重新启动 sshd 将是:
这是一种粘贴
!43
然后按 Enter

在 Gnome 终端上,我将 Ctrl+Shift+C 替换为 Ctrl+C,同样的替换为 +V 和 +F
我使用 Ctrl+Z 而不是 Ctrl+C,并且在许多年中,只有旧包在我需要时发生冲突几次杀死挂起(不同意​​)的 Gnome 终端并再次重新启动任务

许多终端编辑器也从 Gnome 终端继承了 Ctrl+C。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-05
    • 2017-01-13
    • 2012-06-24
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    相关资源
    最近更新 更多