防止 Vim 在退出时清除剪贴板

问题描述 投票:0回答:8

当我从终端打开 Vim,将一些文本复制到系统剪贴板,然后退出 Vim 时,系统剪贴板将被清除。

如何将复制的文本保留在剪贴板中?

vim clipboard
8个回答
50
投票

综合来自超级用户的答案,只需将以下内容添加到您的

.vimrc

autocmd VimLeave * call system("xsel -ib", getreg('+'))

11
投票

安装 Parcellite,或者 Gnome 的 glipper 和 KDE 的 klipper。

重新启动计算机或手动运行它。

参见:https://wiki.ubuntu.com/ClipboardPersistence


9
投票

基于Matt的回答,以下使用

xclip
代替
xsel

autocmd VimLeave * call system('echo ' . shellescape(getreg('+')) . 
            \ ' | xclip -selection clipboard')

4
投票

我遇到了这个问题和一个相关的问题,用

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。


3
投票

使用NeoVim。默认情况下,退出时不会清除剪贴板。您仍然需要

set clipboard=unnamedplus
(通常在
~/.config/nvim/init.vim
)并安装
xsel
xclip
工具。

请记住,其他一些默认值也有所不同。


1
投票

基于马特的回答

当使用他的方法复制多行时,粘贴时会在行尾添加斜杠。

这应该可以解决这个问题。

autocmd VimLeave * exe ":!echo " . shellescape(getreg('+')) . " | xclip -selection clipboard"

当我将“shellescape”与“system”一起使用时,换行符不断被转义。但当我使用exe时,这并没有发生。

不知道真正的原因。但这有效。


0
投票

如果我错了,请纠正我,但根据我对 Vim 的理解......
1) Vim 使用寄存器而不是剪贴板来存储复制/剪切的数据。
2) 这些寄存器在退出 vim 时保留在状态文件中,但在运行进程之外无法访问,除非您手动打开文件并检查其内容
3) 在 Vim 运行时将内容保存到 + 寄存器允许您粘贴到其他应用程序。 4) 通过暂停 vim (CTRL-Z) 而不是关闭它,这些寄存器仍然可以访问。

这提供帮助吗?


0
投票
这是 Neovim

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})
不过,退出后似乎确实需要一两秒钟才能真正被复制。

© www.soinside.com 2019 - 2024. All rights reserved.