当我从终端打开 Vim,将一些文本复制到系统剪贴板,然后退出 Vim 时,系统剪贴板将被清除。
如何将复制的文本保留在剪贴板中?
安装 Parcellite,或者 Gnome 的 glipper 和 KDE 的 klipper。
重新启动计算机或手动运行它。
基于Matt的回答,以下使用
xclip
代替xsel
:
autocmd VimLeave * call system('echo ' . shellescape(getreg('+')) .
\ ' | xclip -selection clipboard')
我遇到了这个问题和一个相关的问题,用
ctrl-z
暂停 vim 也会清除剪贴板。我扩展了 Matt 的解决方案 来解决这两个问题:
set clipboard=unnamedplus
if executable("xsel")
function! PreserveClipboard()
call system("xsel -ib", getreg('+'))
endfunction
function! PreserveClipboadAndSuspend()
call PreserveClipboard()
suspend
endfunction
autocmd VimLeave * call PreserveClipboard()
nnoremap <silent> <c-z> :call PreserveClipboadAndSuspend()<cr>
vnoremap <silent> <c-z> :<c-u>call PreserveClipboadAndSuspend()<cr>
endif
if executable("xsel")
防护装置可避免在未安装 xsel
时出现错误。当从正常模式挂起时, nnoremap
映射会保留剪贴板,而 vnoremap
映射则处理从视觉或选择模式挂起的情况。
我已经确认这适用于 vim 7.4 和 8.0。
使用NeoVim。默认情况下,退出时不会清除剪贴板。您仍然需要
set clipboard=unnamedplus
(通常在 ~/.config/nvim/init.vim
)并安装 xsel
或 xclip
工具。
请记住,其他一些默认值也有所不同。
基于马特的回答
当使用他的方法复制多行时,粘贴时会在行尾添加斜杠。
这应该可以解决这个问题。
autocmd VimLeave * exe ":!echo " . shellescape(getreg('+')) . " | xclip -selection clipboard"
当我将“shellescape”与“system”一起使用时,换行符不断被转义。但当我使用exe时,这并没有发生。
不知道真正的原因。但这有效。
如果我错了,请纠正我,但根据我对 Vim 的理解......
1) Vim 使用寄存器而不是剪贴板来存储复制/剪切的数据。
2) 这些寄存器在退出 vim 时保留在状态文件中,但在运行进程之外无法访问,除非您手动打开文件并检查其内容
3) 在 Vim 运行时将内容保存到 + 寄存器允许您粘贴到其他应用程序。
4) 通过暂停 vim (CTRL-Z) 而不是关闭它,这些寄存器仍然可以访问。
init.lua
的解决方案,它也避免了这个 bug,以及退出 Neovim 时产生的错误消息:
vim.api.nvim_create_autocmd({ "VimLeave" }, {
callback = function()
vim.fn.jobstart('echo "' .. vim.fn.getreg('+') .. '" | xclip -selection clipboard -i', {detach=true})
end,
})
我目前无法测试 Wayland 的解决方案,但对于 wl-copy
,它应该能够将文本作为命令后的字符串列表,因此这样的方法应该可行:
vim.fn.jobstart({'wl-copy', vim.fn.getreg('+')}, {detach=true})
不过,退出后似乎确实需要一两秒钟才能真正被复制。