当我从终端打开Vim,将一些文本复制到系统剪贴板中,然后退出Vim时,系统剪贴板会被清空。
如何保留已复制的文本在剪贴板中?
从superuser综合答案,只需将以下内容添加到您的.vimrc
文件中即可:
autocmd VimLeave * call system("xsel -ib", getreg('+'))
getreg('+')
。 - ZyXsudo
进行复制粘贴,则只能在具有sudo访问权限的应用程序中使用。花了我一个小时才意识到为什么我无法在终端中粘贴我已经以sudo
打开的内容。 - Dexter安装 Parcellite,或 Gnome 下的 glipper 和 KDE 下的 klipper。
重新启动计算机或手动运行它。
根据马特的回答,以下代码使用xclip
代替xsel
:
autocmd VimLeave * call system('echo ' . shellescape(getreg('+')) .
\ ' | xclip -selection clipboard')
echo -n
,这样它就不会向您的剪贴板添加新行 ;) - DarkWiiPlayerxclip
解决方案可能更少出错,可以这样做:system("xclip -selection clipboard -i", getreg('+'))
。 - Charlie Gorichanaz我遇到了这个问题,以及一个相关的问题,即使用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。
xclip
像这样 call system('echo ' . shellescape(getreg('+')) . \ ' | xclip -selection clipboard')
。当我使用 ctrl+shift+v 时,会在使用 <c-z> 暂停 vim 后冻结我的终端一分钟。 - roachsinaiset clipboard=unnamedplus
(通常在~/.config/nvim/init.vim
中)并安装xsel
或xclip
工具。
请记住,一些其他默认设置也是不同的。
clipboard=unnamedplus
对我很有帮助。它甚至解决了剪贴板在不同标签页之间无法传递的问题。 - Misguided Chunkclipboard=unnamedplus
对我很有帮助。它甚至解决了剪贴板在标签页之间无法传递的问题。 - Misguided Chunk基于 Matt的答案
当使用他的方法复制多行时,粘贴时会在行末添加反斜杠。
这应该可以解决这个问题。
autocmd VimLeave * exe ":!echo " . shellescape(getreg('+')) . " | xclip -selection clipboard"
如果我理解没错的话,Vim 的一些特点是:
1)Vim 使用寄存器而不是剪贴板来存储复制/剪切数据。
2)这些寄存器在退出 Vim 时会被保存到状态文件中,但除非您手动打开文件并检查其内容,否则无法在运行进程之外访问它们。
3)在 Vim 运行时将内容保存到 + 寄存器中,可以将其粘贴到其他应用程序中。
4)通过暂停 Vim(CTRL-Z)而不是关闭它,这些寄存器仍然可以访问。
这是否有所帮助?
*
寄存器可再现,并且在某些更新后,它开始以+
寄存器的方式工作(如果我没有弄错,那应该是X更新)。 - ZyX