【问题标题】:Prevent Vim from clearing the clipboard on exit防止 Vim 在退出时清除剪贴板
【发布时间】:2011-06-23 11:56:23
【问题描述】:

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

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

【问题讨论】:

  • 阅读投票结束的常见问题解答。 “程序员常用的软件工具”不是题外话。
  • @TLP 必须是 Linux。如果我没记错的话,过程如下: 1. 你复制文本。 2. Vim 告诉 X 它有剪贴板的数据(«告诉它有数据»,而不是«将数据放入剪贴板»)。 3. 你退出 vim。 4. X 现在不知道他可以从哪里获取剪贴板的数据:剪贴板已被“清除”。
  • 所以解决方法可能如下:创建一个守护进程,当某事告诉 X 它(某事)有剪贴板数据时,将获取该数据,然后告诉 X 它(守护进程)有该数据.在这种情况下,当某些东西退出时,守护程序仍将存在并能够提供此数据。在您的存储库中搜索“剪贴板管理器”,它应该可以解决此问题。
  • 这在 OS X 上不会发生在我身上。即使退出 vim,我也可以访问剪贴板中的数据内容。您确定要使用+ 寄存器进行复制吗?
  • @yoda 只有在使用 X(xorg-server,而不是 OS X)时才会发生这种情况。

标签: vim clipboard


【解决方案1】:

综合来自superuser 的答案,只需将以下内容添加到您的.vimrc

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

【讨论】:

  • 它并不完全符合 TS 的要求:它将默认寄存器的值保存到剪贴板,而不是剪贴板寄存器。你应该使用getreg('+')
  • 感谢 Matt 和 ZyX 的工作。它需要安装'xsel'。我使用了 getreg('+')。
  • @Mike 你找到 gvim 的解决方案了吗?我也遇到过同样的问题。
  • @dmitmedv 不,我还没有。我不知道为什么这适用于 vim 但不适用于 gvim。
  • 在 Ubuntu 18.04 上,这有时会导致 vim 崩溃(段错误)或退出时挂起
【解决方案2】:

为 Gnome 安装 Parcellite 或 glipper,为 KDE 安装 klipper。

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

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

【讨论】:

  • 我不明白为什么人们会否决这个答案。它表明问题不仅仅是因为 Vim 的行为方式 - 它影响了许多应用程序。该链接显示如何解决所有受影响应用程序的问题。你还想要什么?
  • 有些人,比如我自己,实际上并不想要一个完整的剪贴板管理器,因为我们希望剪贴板在不再需要时立即消失(例如,因为它包含敏感数据)。幸运的是,Parcellite 提供了一个守护程序模式,在该模式下它会“只是”保持剪贴板的安全。
  • 我发现 parcelite 好像把剪贴板弄乱了,总体不够可靠。
【解决方案3】:

基于Matt's answer,以下使用xclip代替xsel

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

【讨论】:

  • 这对我来说最有效,但是每个复制的行在粘贴回来时都包含一个尾随反斜杠。其他人有这个问题吗/有人知道解决方案吗?
  • 使 echo -n 不会在剪贴板中添加换行符 ;)
  • 哦,在编辑另一个答案后才看到这个答案。尽管如此,xclip 解决方案可能不太容易出错:system("xclip -selection clipboard -i", getreg('+'))
【解决方案4】:

我遇到了这个问题和一个相关的问题,即使用 ctrl-z 暂停 vim 也会清除剪贴板。我已经扩展 Matt's solution 来修复这两个问题:

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 将在使用 暂停 vim 后冻结我的终端一分钟。
【解决方案5】:

使用NeoVim。默认情况下,它不会在退出时清除剪贴板。您仍然需要set clipboard=unnamedplus(通常在~/.config/nvim/init.vim)并安装xselxclip 工具。

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

【讨论】:

    【解决方案6】:

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

    这能提供帮助吗?

    【讨论】:

    • 当 vim 仍在运行时,我可以粘贴到其他窗口/终端。用 ctrl+z 挂起 vim 正在清除复制的文本,如 exit。
    • 再说一次,我的经验非常有限,因为我通常通过 PuTTY 终端使用 vi。我能够学到的要点是程序在运行时使用本地寄存器将数据存储到剪贴板,一旦应用程序终止,寄存器就会被清除并且数据无法访问,保存它在关闭时写入的缓存文件。如果这也会影响暂停状态,我不能提出任何其他建议。祝你好运:D
    【解决方案7】:

    基于Matt's answer

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

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

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

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

    不知道真正的原因。但这行得通。

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多