我通过ssh访问服务器,在其中运行vim编辑文件。当我尝试使用y或"+y将文本从vim复制到我的Mac(Lion)本地编辑器时,它无法正常工作。我最后得到的是我上次在本地复制的文本。但如果我在vim中使用p,则可以正常工作。
进一步补充Ray的回答...
当你通过SSH使用Vim在远程服务器上时,你在Vim中进行的所有操作都是在远程服务器上完成的。远程服务器和你在其上运行的远程Vim实例对你本地计算机及其系统剪贴板几乎没有实际了解。
因此,y
命令永远不会将复制的文本放入你的本地剪贴板。
为了将从远程Vim中复制的文本块复制到你本地计算机的剪贴板,你有三个选择:
使用鼠标选择文本,然后像在任何Mac OS X应用程序中一样按下Cmd+C。
显然,这似乎是最简单的方法,但它至少有三个限制:
它限于当前屏幕。如果你要复制的文本未完全显示,你将无法复制全部内容。
它与set mouse=a
设置不兼容。使用此选项时,尝试使用鼠标选择任何内容都将导致visual模式选择,无法使用Cmd+C复制。作为解决方法,你可以使用Alt+鼠标选择文本而不进入visual模式,或者从远程~/.vimrc
文件中删除此设置。
行号也会被复制。
将复制的文本放入临时文件中,使用scp
将其传输到本地计算机,并使用pbcopy
将其放入系统剪贴板。
这个解决方案似乎有点复杂,但它是有效的(而且问题本身也有一点错综复杂)。多年来,我看过许多不同的实现,从简单的一行代码到客户端/服务器设置 (这里是其中之一),可以自由地在网络上搜索其他的实现方法。
如果可用,使用X-forwarding将本地剪贴板连接到远程剪贴板。
:set nonum
切换行号。 - Goodword遇到了这个问题——从OSX通过SSH登录到Linux服务器时,无法复制使用vim打开的文件中的文本。
我的解决方案是::set mouse=i
默认情况下,鼠标在所有模式下都是启用的。当你将它设置为仅在插入模式下启用时,你可以在不编辑(正常模式)时滚动和复制内容,但当你开始编辑(通过I或插入键)进入插入模式时,鼠标会充当光标位置,你无法从终端复制。
您可以在~/.vimrc中设置该选项。
有关您可以设置和模式的更多信息,请参见:help mouse。
:set mouse=i
对我也起作用。没有指定任何与 mouse
相关的属性,使用鼠标选择文本会启用可视模式。仅运行 :set
,这是唯一的鼠标设置:ttymouse=xterm2
。请注意,在我运行 :set mouse=i
后,ttymouse=xterm2
仍然存在,但我能够使用鼠标选择文本并使用 Mac 剪贴板进行复制。 - Kaan我在stackoverflow上的第一个答案,但我觉得这是一个酷(虽然很小)的技巧,值得发布。所以这就是我做的:
cat <filename>
当文本被打印到终端上时,我使用鼠标选择所有文本(因为我们在终端窗口中,所以鼠标滚轮可用)。然后使用 Cmd
+C
复制该文本,并粘贴到我的本地文本编辑器中。
这个技巧唯一的缺点是如果你的文件有成千上万行,使用鼠标选择所有行将是一项繁琐的任务。但对于大约2k行的文件,它运作良好。
!cat >> %
命令,然后进行粘贴,按下ctrl-C停止 cat。运行 :e!
命令,内容就会出现在文件的底部。 - jstaab! cat % | head -764
。 - OscarJ我的常规解决方法是通过scp从本地机器使用vim编辑文件。
:e scp://remoteuser@server.tld//path/to/document
这样可以使你的缓冲区本地化,并且很容易复制到你的本地剪贴板。
另一个优点是你可以使用本地vim设置(.vimrc设置、插件等)
zsh:1: command not found: it2copy
。 - Orif Milodhttps://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 '+' |
\ execute 'OSCYankRegister +' |
\ endif
在通过ssh连接到终端的vi内部,使用yank命令会将所选行复制到远程机器上vi的内部缓冲区中,而非复制到您Mac电脑的剪贴板中。
此时您可以使用鼠标来进行复制。 :)
set mouse=a
,它就能正常工作。真正的问题是复制行号或每次复制时都必须将其关闭。编辑远程文件也可以正常工作:http://vim.wikia.com/wiki/Editing_remote_files_via_scp_in_vim - None.vimrc
文件中添加以下内容:nmap yr :call system("ssh $machineA_IP pbcopy", @*)<CR>
这样,在正常模式下,如果你将某些内容复制到*寄存器中,然后输入yr
,则假设你已经正确地使用+clipboard
和*
寄存器设置了Vim,Vim @ machine_B的*
寄存器的内容将被复制到机器A的本地剪贴板中。
######################## 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”。
对于那些在Vagrant上工作的人,有一个包装器vssh,它将执行vagrant ssh ,但还会启动并安装必要的组件。
最新代码片段在此处 - 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
别名包装了ssh命令,可能会出现一些意外问题。如果需要执行不带整个remotecopyserver的ssh,则可以使用ssho
。或者,您可以使用别名ssh2,并保持ssh命令不变。
Mac + SSH + iTerm2 + Neovim 操作指南:
~/.iterm2
添加到 $PATH
变量中。~/.local/bin
中创建一个 ttyup
命令。~/.local/bin
添加到 $PATH
。g:clipboard
声明添加到您的 init.vim
文件中。ttyup
:
#!/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"
init.vim
:
let g:clipboard = {
\ 'name': 'myClipboard',
\ 'copy': {
\ '+': ['ttyup'],
\ '*': ['ttyup'],
\ },
\ 'paste': {
\ '+': '+',
\ '*': '*',
\ },
\ 'cache_enabled': 0,
\ }
y
剪切一些内容时,它会将其填充到我的本地 Mac 剪贴板中。唯一的问题是,当我使用 p
在远程 vim 中粘贴内容时,会出现以下错误:Error detected while processing function provider#clipboard#Call[9]..function provider#clipboard#Call[6]..268[7]..<SNR>35_try_cmd:
E475: Invalid value for argument cmd: '+' is not executable
。目前我只是忽略了这个错误。 - Xander Dunn
set clipboard=unnamed
。这适用于在Mac终端中使用Debian 10。 - frozenjim