通过 SSH 访问 vim + COPY + mac

我通过 ssh 访问一个服务器,在其上运行 vim 来编辑文件。当我试图在 mac (lion)上用 y 或“ + y”将文本从 vim 拉入本地编辑器时,它不起作用。最后得到的是我上次在本地复制的文本。只要在 vim 中使用 p 就可以了。

49445 次浏览

vi内部的终端中进行延伸操作,您可以通过 ssh 将这些行复制到远程机器上 vi 的内部缓冲区中,而不是复制到 Mac 的剪贴板中。

用你的鼠标:)

试试另一个剪贴板寄存器 -"*y

为了详细说明 Ray 的回答..。

当您通过 SSH 使用 Vim 开始远程服务器时,您在 Vim 中所做的一切都是在远程服务器上完成的。在远程服务器 还有上运行的远程 Vim 对本地计算机及其系统剪贴板没有任何实用知识。

正因为如此,y将永远不会把拉文本在您的本地剪贴板。

为了复制一大块文本 来自的远程 Vim to您的本地机器的剪贴板,您有三个选项:

  • 用鼠标选择文本,然后按 Cmd + C,就像在任何 MacOSX 应用程序中一样。

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

    1. 它仅限于当前屏幕。如果您想要拉取的文本没有完全显示,您将无法复制所有文本。

    2. set mouse=a配合不好。有了这个选项,任何尝试用鼠标选择的东西将导致一个 视觉效果模式的选择,不能复制与 Cmd + C。作为解决方案,您可以使用 Alt + 鼠标来选择文本,而不需要进入 视觉效果模式,或者只需从远程 ~/.vimrc中删除此设置。

    3. 行号也被复制。

  • 将被拉出的文本放在一个临时文件中,将其 scp到您的本地计算机,并使用 pbcopy将其放在您的系统剪贴板中。

    这个解决方案似乎有点复杂,但它确实有效(而且问题本身也有点复杂)。这些年来,我看到了许多不同的实现,从简单的一行到客户机/服务器设置。Here is one,随时为其他人搜索。

  • 如果可用,使用 X 转发将本地剪贴板连接到远程剪贴板。

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

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

这样可以使缓冲区保持在本地,并且很容易复制到本地剪贴板。

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

下面是 romainl 对解决方案 # 2的更新。它创建 ssh 命令的别名,如果没有运行,则启动 Remotecopyserver,并在远程服务器中安装 Remoteccopy (rlip)。简而言之,除了将下面的代码片段粘贴到 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”,每当它要求的秘密密钥。

意外收获

对于那些工作在流浪者,有一个包装器 < strong > vssh ,它将执行 流浪汉,但也启动和安装必要的组件。

参考文献

Latest code snippet here - 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

警告

The alias wraps the ssh command and there might be some unexpected issues. ssho is available if you need to execute ssh without the whole remotecopyserver thing. Alternatively, you can use the alias ssh2 and keep the ssh command as it is.

Had this problem - log in from OSX over SSH to a linux box and cannot copy text from a file, opened with vim.

我的变通方法是 :set mouse=i

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

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

有关可以设置的值和模式的更多信息,请参见: help Mouse。

My first answer on stackoverflow, but I feel it's a cool (albeit tiny) trick and it's worth posting. So here's what I do :

cat <filename>

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

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

或者,从终端写入 less [filename]将其写入终端。然后用鼠标开始选择,同时按住 down-arrow键。然后你可以选择整束。

在使用鼠标复制 vim 文本过程中,如果行数略微超出屏幕,我经常使用的一个技巧是对文本使用 最小化(Cmd +’-’)。*)尽量减少你无法用眼睛看到的内容,但你可以一次性复制所有文本。

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

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

这样,在正常模式下,如果您将某些内容复制到 * register,然后键入 yr,那么 Vim@machine _ B 中的 * register 的内容将被复制到计算机 A 的本地剪贴板,假设您已经正确地使用 +clipboard* register 设置了 Vim

ITerm2Shell 实用程序附带了 it2copy,它允许从远程服务器复制到客户端剪贴板。在远程服务器上安装 Shell 实用程序,并确保检查了 Applications in terminal may access clipboardenter image description here

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

我希望在这里改进我的解决方案,但相反,我将分享它,因为它看起来与其他一些解决方案不相上下。

在 Mac 上使用 iTerm2时,在机器上运行 tmux,然后用 Vim 进行编辑,我在 Mac 上有一个垂直分割的 iTerm2窗口,我把它拉到一边,使它尽可能地窄。

Then when I want to copy text from Vim, I will click into the tiny slice of iTerm2 window, and go back over and highlight and then copy the text from Vim. This works the best for single lines of text.

如果有一个 tmux 垂直分割,突出显示 Vim 缓冲区中的多行不会正确换行,并且会从其他 tmux 窗口复制文本,但是除此之外,这对于复制我需要的90% 的内容非常有用,而不需要退出 Vim、打开文件或者做其他事情。

我还有足够的水平窗口空间,使小的 iTerm2窗口不会占用太多空间。

Just use MobaXterm.
I tried lots of ways and none of them is easy. So the only solution I could find is using 您可以查看所有的文件并以任何方式打开它们。

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


最简单的方法复制到本地机器是通过鼠标选择,然后 CMD + c复制。正如在 另一个答案中所指出的,这有一些限制/缺点。因此,我找到了替代方案,但是在尝试了几个小时(不成功)让 X11转发工作之后,我想出了下面这个简单的解决方案(至少对于行号警告)来帮助复制鼠标。

将以下内容添加到您的 .vimrc中,以便轻松地切换鼠标复制的行号:

nnoremap L :set invnumber <CR>

您可以轻松地将 L更改为您所选择的任何希望成为快捷键的键。

Mac + ssh + iterm2 + neovim 说明:

  1. Ssh 到服务器。
  2. Install iterm shell integration.
  3. ~/.iterm2添加到 $PATH变量。
  4. Create a ttyup command in e.g. ~/.local/bin.
  5. ~/.local/bin添加到 $PATH,如果还没有的话。
  6. g:clipboard声明添加到 init.vim

返回文章页面

#!/bin/bash
# @medgar's ttyup script for passing the output to the parent shell


parent() { awk '{print $4}' "/proc/$1/stat"; }
leader() { awk '{print $6}' "/proc/$1/stat"; }
it2copy > "/proc/$(parent $(leader $$))/fd/0"

返回文章页面

let g:clipboard = {
\   'name': 'myClipboard',
\   'copy': {
\      '+': ['ttyup'],
\      '*': ['ttyup'],
\   },
\   'paste': {
\      '+': '+',
\      '*': '*',
\   },
\   'cache_enabled': 0,
\ }

@ andrewgazelka 有一个很棒的解决方案

我没有它的拷贝脚本: https://github.com/gnachman/iTerm2-shell-integration/blob/main/utilities/it2copy

下面是我下载的代码:)

Hope someone will feel it is helpful :)

我将 it2copy 移动到/usr/bin 目录中,以便同时用于服务器和 Macbook