对于vim(neovim)这个软件,我大部分时间是在远程机器上使用的。复制远程ssh中的文本到本地是很觉了的。如果复制内容少可以直接鼠标选中进行复制即可,缺点也比较显示:
- 复制下来的文本经常格式已经变化了,比如:增加了行号信息,换行的地方还需要调整。
- 超过一页的内容无法连续复制
以前遇到大文件的复制,我只好使用sftp下载下来在复制。但是这样操作太繁琐了。今天终于找到了比较好的解决办法。
先决条件本地需要一个支持 OSC 52 的终端,很多终端都是支持的。
- Linux 下的 xterm,设置 disallowedWindowOps: 20,21,SetXprop
- Mac 下的 iterm2,勾选 Applications in terminal may access clipboard
我使用的是macOS下面的iterm2
创建一个文件clipboard-provider,并写入以下内容。
#!/bin/bash
# Taken and modified from https://github.com/agriffis/skel/blob/master/neovim/bin/clipboard-provider
#
# clipboard provider for neovim
#
# :help provider-clipboard
#exec 2>> ~/clipboard-provider.out
#set -x
: ${COPY_PROVIDERS:=tmux pb xclip osc52 local}
: ${PASTE_PROVIDERS:=xclip pb tmux local}
: ${TTY:=`(tty || tty /dev/null | grep /dev/`}
LOCAL_STORAGE=$HOME/.clipboard-provider.out
main() {
declare buffer status=1
case $1 in
copy)
buffer=$(base64 | tr -d '\n')
internal() { base64 --decode /dev/null;then return $(is-copy $1); fi
case $1 in
copy) internal | pbcopy ;;
paste) pbpaste ;;
esac
}
osc52-provider() {
# HACK: this ignores stdin and looks directly at the base64 buffer
case $1 in
copy) [[ -n "$TTY" ]] && printf $'\e]52;c;%s\a' "$buffer" > "$TTY" ;;
paste) return 1 ;;
esac
}
local-provider() {
case $1 in
copy) internal > $LOCAL_STORAGE ;;
paste) cat $LOCAL_STORAGE && return 0;;
esac
}
xclip-provider() {
if ! command -v xclip &>/dev/null;then return $(is-copy $1); fi
case $1 in
copy) internal | xclip -i -selection clipboard;;
paste) xclip -o -selection clipboard;;
esac
}
main "$@"
# 设置可执行权限
chmod +x clipboard-provider
# 复制到path之中,放哪都行,只要在path中即可
cp clipboard-provider /usr/local/bin/
配置neovim的vimrc
我使用的是neovim,vim是否可以我没有测试。 编辑配置文件:
nvim ~/.config/nvim/init.vim
增加以下内容:
"ssh 远程粘贴板
if executable('clipboard-provider')
let g:clipboard = {
\ 'name': 'myClipboard',
\ 'copy': {
\ '+': 'clipboard-provider copy',
\ '*': 'env COPY_PROVIDERS=tmux clipboard-provider copy',
\ },
\ 'paste': {
\ '+': 'clipboard-provider paste',
\ '*': 'env COPY_PROVIDERS=tmux clipboard-provider paste',
\ },
\ }
endif
配置完成后,重启nvim。v选中要复制的文本内容按"+y
即可把内容复制到本地剪切板,非常的方便。
上面配置完成后,可以直接使用。但是发现在tmux中打开nvim无法把内容复制到本地剪切板。 解决办法: 编辑~/.tmux.conf
增加下面一行:
set -g set-clipboard on
重新加载tmux配置 可以在tmux 模式下的命令行模式下执行 (进入命令行模式的命令 ctrl + b 然后再按个冒号: )
source-file ~/.tmux.conf
这样就可以了。如果你发现你的tmux中还是不行的话,可能是你的tmux的path中没有clipboard-provider ,新建一个窗口就可以了。
参考https://lotabout.me/2019/Integrate-clipboard-with-SSH/