Vim 中复制和粘贴的问题
支持 clipboard
首先就是先要支持系统剪切板,查看: vim --version | grep clipboard
,没有的话就安装 vim-gtk
(Ubuntu), gvim
(Arch).
复制后缩进等格式混乱
一般出现于跨机器的复制粘贴中,比如我常常在服务器进行 Shift+Insert(即复制,理解成 C-shift-V) 遇到问题。
使用 set paste
进行 PASTE 模式,然后粘贴,最后 set paste!
返回 NORMAL 模式。
set paste
原理是将缩进等等常规设置全部清空。
远程服务器的复制粘贴
困扰了很久的问题,终于得到解决,不过需要 sudo 权限才可以完成。
创建一个脚本文件 clipboard-paste
#!/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 </proc/$PPID/fd/0) 2>/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 <<<"$buffer"; }
for p in $COPY_PROVIDERS; do
internal | $p-provider copy && status=0
done ;;
paste)
for p in $PASTE_PROVIDERS; do
$p-provider paste && status=0 && break
done ;;
esac
exit $status
}
is-copy() {
if [[ "$1" == "copy" ]]; then return 0; else return 1; fi
}
tmux-provider() {
[[ -n $TMUX ]] || return is-copy
case $1 in
copy) internal | tmux load-buffer - ;;
paste) tmux save-buffer - ;;
esac
}
pb-provider() {
if ! command -v pbcopy &>/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 "$@"
在服务器中可执行路径中放入如下脚本文件,比如我目前为
/usr/bin/clipboard-paste
. 并且添加 x 权限。
在 .vimrc 中添加如下内容。
"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
重启 vim 应该就可以了。
[1] https://blog.csdn.net/lxyoucan/article/details/117701069