通过SSH vim + COPY + mac

时间:2012-05-22 00:55:48

标签: macos vim ssh

我通过ssh访问服务器,我运行vim来编辑文件。当我尝试将文本从vim本地放入我的mac(lion)本地编辑器时,或者使用y或“+ y它不起作用。我最终得到了我在本地复制的文本。如果我只使用p内部它会起作用vim好吧。

12 个答案:

答案 0 :(得分:45)

扩展Ray的答案......

当您通过SSH在远程服务器上使用Vim 时,您在Vim中执行的所有操作都在远程服务器上完成。远程服务器您在其上运行的远程Vim对本地计算机及其系统剪贴板缺乏实用知识。

因此,y永远不会将被删除的文本放在本地剪贴板中。

为了将 远程Vim 中的一大块文本复制到本地计算机的剪贴板,您有三个选择:

  • 用鼠标选择文本,然后点击 Cmd + C ,就像在任何Mac OS X应用程序中一样。

    显然,这似乎是最简单的,但它至少有三个限制:

    1. 仅限当前屏幕。如果您想要抽出的文字没有完全显示,您将无法复制所有文字。

    2. set mouse=a效果不佳。使用此选项,任何使用鼠标选择内容的尝试都将导致可视模式选择,无法使用 Cmd + C 复制。作为解决方法,您可以使用 Alt +鼠标选择文本而无需进入 visual 模式,或者只是从远程~/.vimrc中删除此设置。

    3. 也会复制行号。

  • 将抽取的文本放入临时文件scp,将其放入本地计算机,然后使用pbcopy将其放入系统剪贴板。

    这个解决方案似乎有点复杂,但它有效(问题本身也有点复杂)。多年来,我看到了很多不同的实现,从简单的一个内衬到客户端/服务器设置。 Here is one,随意谷歌寻找其他人。

  • 使用X-forwarding将本地剪贴板连接到远程剪贴板(如果有)。

答案 1 :(得分:11)

我的首选解决方案是通过scp从本地计算机使用vim编辑文件。

:e scp://remoteuser@server.tld//path/to/document

这样可以使缓冲区保持在本地状态,并且可以轻松复制到本地剪贴板。

另一个好处是你可以使用你的本地vim设置(.vimrc设置,插件等)。

答案 2 :(得分:5)

我在stackoverflow上的第一个答案,但我觉得这是一个很酷的(虽然很小)的伎俩,值得发布。所以这就是我的所作所为:

cat <filename>

当文本打印到终端上时,我用鼠标选择所有文本(鼠标滚动工作,因为我们在终端窗口上)。然后使用Cmd + C复制该文字并粘贴到我的本地文本编辑器中。

这个技巧的唯一缺陷是,如果您的文件长达数万行,那么使用它是不切实际的,因为用鼠标选择所有行本身就是一项任务。但对于大约2k行的文件,它运行良好。

答案 3 :(得分:2)

在您要搜索的终端中vi内进行Yanking,将这些行复制到远程计算机上的vi内部缓冲区中,而不是复制到Mac的剪贴板中。

使用鼠标。 :)

答案 4 :(得分:1)

我在使用鼠标复制vim文本时常常使用的一个技巧,如果行数过少,那么我的屏幕就会最小化(Cmd +' - ')文本。 :)最大限度地减少你无法通过眼睛看到但你可以一次性复制所有文本。

答案 5 :(得分:1)

在MacOS上,当SSH从机器A到机器B并在机器B中使用vim时,我将其添加到机器B的.vimrc中:

nmap yr :call system("ssh $machineA_IP pbcopy", @*)<CR>

这样,在正常模式下,如果您将某些内容复制到*寄存器,然后键入yr,则vim @ machine_B中*寄存器的内容将复制到计算机A的本地剪贴板中,前提是您拥有使用+clipboard*注册正确设置Vim

答案 6 :(得分:1)

iTerm2 Shell实用程序随附it2copy,可从远程服务器复制到客户端剪贴板。在远程服务器上安装Shell Utilities,并确保已选中Applications in terminal may access clipboardenter image description here

然后,进入visual mode,选择文本并执行<,'>:w !it2copy

答案 7 :(得分:0)

或者,从终端写入<!DOCTYPE html> <html ng-app="ReqWebApp"> <head> <meta charset="UTF-8"> <title>New Request</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> </head> <body ng-controller="ReqAppController"> <p><span>Add New Request | Accept <input type="checkbox" name="accept"> | Decline <input type="checkbox" name="decline"></span></p> <table border="1"> <tr><th>REF : {{GenerateRef}}</th> <th>Producer Reference : <input type="text" name="prodRef"></th></tr> <tr><th>Producer : <select> <option>EXAMPLE</option> <option>EXAMPLE</option> </select></th> <th>Producer Site : <input type="text"></th> </tr> </table> </body> </html>以将其写入终端。然后在按住less [filename] - 键的同时用鼠标选择开始。然后你可以选择整个群。

答案 8 :(得分:0)

我希望在这里改善自己的解决方案,但可以像其他一些人一样分享它。

在Mac上使用iTerm2时,将其切入计算机中,运行tmux,然后使用Vim进行编辑,我在Mac上有一个垂直拆分的iTerm2窗口,该窗口一直拉到一边,以使其尽可能的薄

然后,当我想从Vim复制文本时,我将单击进入iTerm2窗口的小片段,然后返回并突出显示,然后从Vim复制文本。这对于单行文本效果最好。

如果有一个tmux垂直分割,在Vim缓冲区中突出显示多行将不能正确换行,并且将从另一个tmux窗口复制文本,但是否则,这非常适合复制90%的内容,而无需退出Vim,整理文件或执行其他操作。

我也有足够的水平窗口空间,这使得iTerm2小窗口不会占用空间。

答案 9 :(得分:0)

只需使用 MobaXterm。
我尝试了很多方法,但没有一个是容易的。所以我能找到的唯一解决方案是使用 MobaXterm。您可以查看所有文件并以任何方式打开它们。

答案 10 :(得分:0)

https://github.com/ojroques/vim-oscyank + iTerm2 + tmux 适用于我的情况,这是我的工作流程:

我的 .vimrc 的某些部分

Plug 'ojroques/vim-oscyank'  " clipboard over ssh through tmux

" yank operation don't need to use the *" register (system clipboard)
set clipboard+=unnamedplus

autocmd TextYankPost * if v:event.operator is 'y' && v:event.regname is '' | OSCYankReg " | endif

答案 11 :(得分:-3)

尝试其他剪贴板注册 - "*y