通过SSH vim + COPY + mac

问题描述 投票:29回答:12

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

macos vim ssh
12个回答
48
投票

为了扩展Ray的答案......

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

因此,y永远不会把被拉动的文本放在你的本地剪贴板中。

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

  • 用鼠标选择文本,然后在任何Mac OS X应用程序中点击Cmd + C. 显然,它似乎是最简单的,但至少有三个限制: 它仅限于当前屏幕。如果您想要抽出的文本没有完全显示,您将无法复制所有文本。 它与set mouse=a不相称。使用此选项,任何使用鼠标选择内容的尝试都将导致无法使用Cmd + C复制的可视模式选择。作为解决方法,您可以使用Alt +鼠标选择文本而无需进入可视模式,或者只是从远程~/.vimrc中删除此设置。 行号也被复制。
  • 将拉出的文本放在一个临时文件中,将scp放到本地计算机上,然后使用pbcopy将其放入系统剪贴板中。 这个解决方案似乎有点复杂,但它有效(问题本身也有点复杂)。多年来,我看到了很多不同的实现,从简单的一个内衬到客户端/服务器设置。 Here is one,随意谷歌周围的其他人。
  • 如果可用,使用X-forwarding将本地剪贴板连接到远程剪贴板。

0
投票

或者,从终端写入less [filename]以将其写入终端。然后在按住down-arrow-key的同时用鼠标选择。然后你可以选择整个群。


0
投票

我希望在这里改进我​​的解决方案,但是它会分享它,因为它似乎与其他一些人相提并论。

当在Mac上使用iTerm2,运行tmux,运行tmux,然后使用Vim进行编辑时,我在Mac上有一个垂直分割的iTerm2窗口,我将其拉到一边,使其尽可能瘦。

然后,当我想从Vim复制文本时,我将点击iTerm2窗口的一小部分,然后返回并突出显示然后从Vim复制文本。这对单行文本最有效。

如果有一个tmux垂直分割,突出显示Vim缓冲区中的多行将无法正确包装,并将从另一个tmux窗口复制文本,但否则这非常适合复制我需要的90%,而不必退出Vim ,cat一个文件,或做其他事情。

我还有足够的水平窗口空间,使得小型iTerm2窗口不是太空猪。


-3
投票

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


12
投票

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

:e scp://[email protected]//path/to/document

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

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


9
投票

有这个问题 - 从OSX通过SSH登录到linux盒子,无法从文件复制文件,用vim打开。

我的解决方法是:set mouse=i

默认情况下,在所有模式下都启用鼠标。当您将其设置为仅在插入模式下启用时,您可以在不编辑时滚动并复制(正常模式),但是当您开始编辑(通过按I或Insert键)并进入插入模式时,鼠标将用作光标放置你不能从终端复制。

您可以在〜/ .vimrc中设置该选项

有关可以设置的值和模式的详细信息,请参阅:帮助鼠标。


7
投票

我在stackoverflow上的第一个答案,但我觉得这是一个很酷的(虽然很小)技巧,值得张贴。所以这就是我的工作:

cat <filename>

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

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


4
投票

vi内的一个终端中进行yking,你可以将这些行复制到远程机器上的vi内部缓冲区中,而不是放入Mac的剪贴板中。

用你的鼠标。 :)


1
投票

这是romainl解决方案#2的更新。它创建ssh命令的别名并启动remotecopyserver(如果它没有运行)并在远程服务器中安装remotecopy(rclip)。简而言之,除了将下面的代码段粘贴到bash_profile中之外,您无需执行任何操作。

######################## For SSH Remote Copy #########################
export LC_SETUP_RC='command -v rclip >/dev/null 2>&1 || { echo "executing"; mkdir -p /usr/local/bin; if [ ! -f /usr/local/bin/rclip ];then wget https://raw.githubusercontent.com/justone/remotecopy/master/remotecopy -P /usr/local/bin/; ln -s /usr/local/bin/remotecopy /usr/local/bin/rclip; chmod +x /usr/local/bin/remotecopy; fi; if [[ \":\$PATH:\" == *\"/usr/local/bin:\"* ]]; then export PATH=/usr/local/bin:$PATH; fi } > /var/log/rclip.log 2>&1 || echo "Some error occured in setting up rclip. check /var/log/rclip.log"'

ssh_function() {
count="`ps -eaf | grep remotecopyserver | grep -v grep | wc -l`";
if [ "$count" -eq "0" ]; then 
   mkdir -p $HOME/bin;
   if [ ! -f $HOME/bin/remotecopyserver ]; then 
      wget https://raw.githubusercontent.com/justone/remotecopy/master/remotecopyserver -P $HOME/bin;
      chmod +x $HOME/bin/remotecopyserver;
   fi;
   nohup $HOME/bin/remotecopyserver & 
fi;
ssh_cmd=`which ssh`
PARAMS=""
for PARAM in "$@"
do
  PARAMS="${PARAMS} \"${PARAM}\""
done
bash -c "ssh ${PARAMS} -R 12345:localhost:12345 -t 'echo \$LC_SETUP_RC | sudo bash; bash -l'"
}
alias ssho=`which ssh`
alias ssh=ssh_function
alias ssh2=ssh_function

vssh_function() {
ssh_config=`vagrant ssh-config`;
if [ "$?" -eq "1" ]; then
echo "Problem with Vagrant config. run 'vagrant ssh-config' to debug"
return 1
fi
PORT=`echo "$ssh_config" | grep Port | grep -o "[0-9]\+"`; 
ID_FILE=`echo "$ssh_config" | grep IdentityFile | awk '{print $2}'`
ssh2 -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PasswordAuthentication=no -i $ID_FILE vagrant@localhost -p $PORT "$@"
}
alias vssh=vssh_function

一旦别名被激活,你通常可以使用ssh,每当你需要从vim复制到本地剪贴板时,使用

:w !rclip 

将整个文件复制到剪贴板

:'<,'> !rclip

从可视模式复制选定的行。每当它要求提供密钥时,你必须按“Cmd + V”或“Ctrl + V”。

Bonus

对于那些在Vagrant上工作的人来说,有一个包装器vssh将执行vagrant ssh,但也启动并安装必要的组件。

Reference

这里是最新的代码片段 - https://gist.github.com/ningsuhen/7933b206b92fc57364b2

http://endot.org/2011/12/04/remotecopy-copy-from-remote-terminals-into-your-local-clipboard/

https://github.com/justone/remotecopy

Caveats

别名包装了ssh命令,可能会出现一些意想不到的问题。如果您需要在没有整个remotecopyserver的情况下执行ssh,则可以使用ssho。或者,您可以使用别名ssh2并保持ssh命令不变。


1
投票

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


1
投票

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

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

这样,在正常模式下,如果你复制一些东西到*寄存器,然后输入yr,vim @ machine_B中的*寄存器的内容被复制到机器A的本地剪贴板,假设你已经使用+clipboard*寄存器正确设置了Vim


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.