我通过ssh访问服务器,我运行vim来编辑文件。当我尝试将文本从vim本地放入我的mac(lion)本地编辑器时,或者使用y或“+ y它不起作用。我最终得到了我在本地复制的文本。如果我只使用p内部它会起作用vim好吧。
答案 0 :(得分:45)
扩展Ray的答案......
当您通过SSH在远程服务器上使用Vim 时,您在Vim中执行的所有操作都在远程服务器上完成。远程服务器和您在其上运行的远程Vim对本地计算机及其系统剪贴板缺乏实用知识。
因此,y
永远不会将被删除的文本放在本地剪贴板中。
为了将 远程Vim 中的一大块文本复制到本地计算机的剪贴板,您有三个选择:
用鼠标选择文本,然后点击 Cmd + C ,就像在任何Mac OS X应用程序中一样。
显然,这似乎是最简单的,但它至少有三个限制:
仅限当前屏幕。如果您想要抽出的文字没有完全显示,您将无法复制所有文字。
set mouse=a
效果不佳。使用此选项,任何使用鼠标选择内容的尝试都将导致可视模式选择,无法使用 Cmd + C 复制。作为解决方法,您可以使用 Alt +鼠标选择文本而无需进入 visual 模式,或者只是从远程~/.vimrc
中删除此设置。
也会复制行号。
将抽取的文本放入临时文件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 clipboard
。
然后,进入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
。