【问题标题】:How to make vim paste from (and copy to) system's clipboard?如何从(并复制到)系统的剪贴板进行 vim 粘贴?
【发布时间】:2012-07-14 10:08:11
【问题描述】:

与其他编辑器不同,vim 将复制的文本存储在自己的剪贴板中。因此,我很难从网页中复制一些文本并将其粘贴到当前的工作文件中。碰巧我必须打开 gedit 或手动输入。

我可以在系统剪贴板中进行 vim 粘贴吗?

【问题讨论】:

  • Copy "+y Paste "+p 工作方式与 yank 和 paste 一样,只是您之前指定了注册表。
  • 要使用以下命令,请确保您已经完成 sudo apt-get install vim-gnome 会将该功能添加到使用系统剪贴板的内置 vim 中。
  • @Harnirvair 对于这里的许多读者来说,vim-gnome 可能是矫枉过正或者根本无法在他们的操作系统/发行版中使用,而我怀疑vim-gtk 并且最好是vim-gtk3 更有可能存在和拉更少的依赖,同时仍然提供剪贴板集成(至少对于那些仍在 X11 上的人;我不确定这一切如何与 Wayland 交互)。
  • 在 Fedora 上默认 - 没有剪贴板访问权限(你需要 gvim),superuser.com/questions/194747/…

标签: vim editor clipboard


【解决方案1】:

请注意,如果:echo has('clipboard') 返回 0,则从系统剪贴板复制/粘贴将不起作用。在这种情况下,vim 没有使用+clipboard 功能编译,您必须安装不同的版本或重新编译它。一些 Linux 发行版默认提供最小的 vim 安装,但如果您安装 vim-gtkvim-gtk3,您仍然可以获得额外的功能。

"*"+ 寄存器用于系统的剪贴板 (:help registers)。根据您的系统,他们可能会做不同的事情。例如,在 OSX 或 Windows 等不使用 X11 的系统上,"* 寄存器用于读取和写入系统剪贴板。在 X11 系统上,两个寄存器都可以使用。有关更多详细信息,请参阅 :help x11-selection,但基本上 "* 类似于 X11 的 _PRIMARY_ 选择(通常复制您使用鼠标选择的内容并使用鼠标中键粘贴),"+ 类似于 X11 的 @987654333 @selection(这是正确的剪贴板)。

如果这一切都超出了您的想象,请尝试使用"*yy"+yy 将一行复制到系统的剪贴板。假设您有适当的编译选项,其中一个应该可以工作。

您可能希望将其重新映射为对您更方便的东西。例如,您可以将vnoremap <C-c> "*y 放入您的~/.vimrc 中,这样您就可以直观地选择并按Ctrl+c 拉动到系统的剪贴板。

您可能还想查看:help cb 中描述的'clipboard' 选项。在这种情况下,您可以:set clipboard=unnamed:set clipboard=unnamedplus 使所有拉/删除操作自动复制到系统剪贴板。在某些情况下,当您在剪贴板中存储其他内容时,这可能会带来不便,因为它会覆盖它。

要粘贴,您可以使用"+p"*p(同样,取决于您的系统和/或所需的选择),或者您可以将它们映射到其他东西。我明确地键入它们,但我经常发现自己处于插入模式。如果您处于插入模式,您仍然可以使用<C-r><C-p>*<C-r><C-p>+ 以适当的缩进方式粘贴它们。见:help i_CTRL-R_CTRL-P

还值得一提的是 vim 的 paste 选项 (:help paste)。这将 vim 置于一个特殊的“粘贴模式”,它禁用了其他几个选项,允许您使用终端仿真器或多路复用器熟悉的粘贴快捷方式轻松粘贴到 vim。 (只需键入:set paste 启用它,粘贴您的内容,然后键入:set nopaste 禁用它。)或者,您可以使用pastetoggle 选项设置切换模式的键码(:help pastetoggle)。

我建议使用寄存器而不是这些选项,但如果它们仍然太吓人,这可能是一个方便的解决方法,同时你正在完善你的 vim 印章。

有关更多详细信息,请参阅:help clipboard

【讨论】:

  • 这是非常有用的信息,但是您能否总结一下从系统剪贴板粘贴需要进行哪些击键...例如使用"*p 做什么?我是按 Shift-',然后是 Shift-8,然后是 p,等等?
  • 是的,按顺序输入这三个字符。 vim 中的许多命令使用所谓的“操作员挂起模式”,即按下一个键,然后 vim 等待更多键。以dd 为例。第一个d 进入操作员挂起模式,然后第二个d 完成命令并删除该行。但是,如果您键入 dGG 会将其删除到文件末尾,而不是仅仅删除该行。寄存器使用相同的主体来允许各种命令使用它们。
  • 强调:您需要安装vim-gtk 包(至少在Debian 下),才能获得使用+xterm_clipboard 编译的vim。我花了 4000 万才找到这个,只用了几秒钟就到了sudo apt-get install vim-gtk
  • @DominykasMostauskis vim-gnome 也可以工作并且启用了+xterm_clipboard
  • 谢谢,这非常有用。我想补充一点,如果你的发行版没有“vim-gtk”之类的东西,你可能正在寻找一个名为 gvim 的包。
【解决方案2】:

Linux

在我的 Linux 系统上,+* 寄存器映射到 X11 选择,可以用鼠标中键粘贴。使用:set clipboard=unnamed:set clipboard=unnamedplus时,寄存器映射到剪贴板,可以用CTRL-V粘贴。

具体细节似乎在某种程度上取决于配置和系统,因此您的里程肯定会有所不同。不过,它肯定会让你指向正确的方向。

另见

http://vim.wikia.com/wiki/Accessing_the_system_clipboard

【讨论】:

  • 只有* 映射到X11 主寄存器(通常用鼠标粘贴)。 + 映射到通常由快捷方式粘贴的 X11 剪贴板寄存器。
  • @ZyX 不在我的系统上,但您的里程肯定会有所不同。如果您想要跨平台和软件版本的一致体验,最好明确配置您想要的行为。
  • 我相信这意味着你有像 klipper/glipper 这样的剪贴板管理器,它们能够同步两个缓冲区。它不会改变 vim 使用 * 作为主要寄存器和 + 作为剪贴板 X11 寄存器的事实,你可以在 vim 源代码中看到这一点:these 值在那里设置并且从不修改,和clip_starclip_plus 始终分别用于*+ 寄存器。
【解决方案3】:

您可以通过 gnome-terminal 的粘贴快捷方式粘贴到 vim 中。 将文件置于插入模式并使用

Ctrl+Shift+v.

提前记住

 :set paste 

为了避免弄乱缩进。

【讨论】:

  • 如果有像 python for 循环这样的多行,这会弄乱缩进
  • 对插入模式使用粘贴切换。例如。设置 pastetoggle= 然后在插入模式下,点击 然后插入你的 python 代码。
  • 如果制表符/空格、eols 等显示为可见字符(通过 listchars 选项),则这些替代字符将被复制而不是隐藏字符。
  • 鉴于其简洁的答案,这应该是选定的答案
  • 更新 vim 8+(Linux 和 Mac),只需在普通模式下进行系统粘贴。不再需要插入模式或:set pastestackoverflow.com/questions/11489428/…
【解决方案4】:

这将是您的 vimrc 中为此目的所需的行:

set clipboard+=unnamed  " use the clipboards of vim and win
set paste               " Paste from a windows or from vim
set go+=a               " Visual selection automatically copied to the clipboard

【讨论】:

  • 我喜欢你的解决方案。我想要一个更好的解释。
  • 优秀。使用寄存器总是让我犹豫,不得不思考。这个好多了
  • 我的 vim 版本有 +clipboard,这个选项对我不起作用。我正在使用 Byobu(它在引擎盖下使用 Tmux)。
  • 我必须为 Fedora 添加 set clipboard+=unnamedplus
【解决方案5】:

对于我来说,该配置适用于复制和粘贴

" copy and paste
vmap <C-c> "+yi
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa

【讨论】:

  • 你粘贴了什么?
  • 这个恕我直言是一个更好的解决方案,将 clibboard 设置为未命名 - 不要在每个 x/dd/y 等操作中弄乱操作系统剪贴板。在 Mac 上,最好将 C(ctrl) 修饰符更改为 D 以映射 cmd+c/x/v 组合。
【解决方案6】:

剪贴板

有一个特殊的寄存器来存储这个选择,它是“* 登记。除非有关文本是什么的信息,否则此处没有任何内容 selected 即将改变(例如用鼠标左键单击某处),或者当 另一个应用程序想要粘贴选定的文本。然后放文字 在 "* 寄存器中。例如,剪切一条线并使其成为当前 选择/放在剪贴板上:

    "*dd

同样,当您想要粘贴来自另一个应用程序的选择时,例如, 通过单击鼠标中键,选择被放入“*寄存器 首先,然后像任何其他寄存器一样“放置”。例如,把 选择(剪贴板的内容):

    "*p

寄存器 E354

> There are nine types of registers:                      
> 1. The unnamed register ""
> 2. 10 numbered registers "0 to "9
> 3. The small delete register "-
> 4. 26 named registers "a to "z or "A to "Z
> 5. four read-only registers ":, "., "% and "#
> 6. the expression register "=
> 7. The selection and drop registers "*, "+ and "~ 
> 8. The black hole register "_
> 9. Last search pattern register "/

从剪贴板粘贴

1. Clipboard: Copy
2. Vim insertmode, middle mouse key

检查终端中的 X11 剪贴板支持

当你喜欢在终端中运行 Vim 时,你需要寻找一个支持剪贴板的 Vim 版本。 检查 X11 剪贴板支持,从控制台输入:

% vim --version

如果您看到“+xterm_clipboard”,您就可以开始了。

http://vim.wikia.com/wiki/Accessing_the_system_clipboard

X 服务器维护三个选择,称为:

小学、中学和剪贴板

PRIMARY 选择通常用于实现复制和 通过鼠标中键粘贴。中学和剪贴板 应用程序较少使用选择。

http://linux.die.net/man/1/xsel

【讨论】:

    【解决方案7】:

    在设置:set clipboard=unnamed 之上,如果您在Mac OS X 10.9 上的Terminal.app 上使用vim,您应该使用mvim -v,您可以使用brew install macvim。默认 vim 不支持剪贴板选项。

    【讨论】:

      【解决方案8】:

      对于 vim 安装不支持 * 和 + 寄存器的人的快速说明。无需下载新的 vim 安装即可从剪贴板粘贴。这是另一种方法:

      1) 安装 parcellite(一个内存占用少的剪贴板管理器);

      2) 在您的 .vimrc 文件中,添加以下内容:

      command Clip r !parcellite -c
      

      3) 重启 vim。

      现在,当您输入 :Clip 作为 ex 命令时,剪贴板的内容将被粘贴到光标处。您还可以将新命令映射到功能键,以便一键完成。

      【讨论】:

        【解决方案9】:

        没有 +clipboard,所以我想出了这个使用 xsel 的替代解决方案:

        添加到你的 ~/.vimrc:

        vnoremap &lt;C-C&gt; :w !xsel -b&lt;CR&gt;&lt;CR&gt;

        【讨论】:

        • 感谢这个好主意!我最终使用了:vnoremap &lt;C-C&gt; :w !xclip -i -sel c&lt;CR&gt;&lt;CR&gt;
        • xsel 和 xclip 都有效,但视觉选择扩展到整行。但是按 C-C 两次可以正常工作!我不知道为什么...
        【解决方案10】:

        从康纳的回答开始,这很好,但是插入模式下的C-R C-p +C-R C-p * 有点不方便。同样来自命令模式的 "*p"+p

        一位 VIM 专家建议将 C-v 映射到 C-r C-p + 所做的事情。

        :inoremap &lt;C-v&gt; &lt;C-o&gt;"+p 只能用于插入模式

        如果你真的想覆盖逐块视觉模式(他不推荐作为视觉模式 模式很好)你可以有map &lt;C-v&gt; "+p

        【讨论】:

          【解决方案11】:

          我尝试了上面的建议,但没有一个在我的环境中起作用。 (通过 ssh 克隆 Windows PuTTY)

          出现了一些额外的谷歌搜索: https://unix.stackexchange.com/questions/110684/copy-paste-into-sshd-vim-from-local-windows-clipboard

          其中一个 cmets 建议使用 SHIFT+INSERT,它可以将我桌面的剪贴板粘贴到 Vim 的缓冲区中。 Ctrl-C 已经开始从 Vim 复制到桌面的剪贴板。

          【讨论】:

          • 我正在使用 cmder 工具 [windows 8.1] 中的 vim。当您进入cmder设置>键和宏>粘贴时,我得到了用于多行粘贴的shift+insert命令和用于单行粘贴的ctrl+v。
          • 对我来说,一个简单的右键单击就像一个魅力!只需右键单击!
          • 因为您使用的是终端并且 ssh vim 无法通过 SSL 访问您本机系统的剪贴板。 SHIFT+INSERT 之所以有效,是因为它是您的终端(或者在您的情况下是 PuTTY)的粘贴选项;但是,缩进很可能是错误的。查看我关于 paste 选项的回答的最后一段来纠正这个问题。
          • @jinksPadlock。谢谢..是的..我可以通过鼠标复制/粘贴..试图通过“仅键盘”来弄清楚如何做到这一点。从 windows 复制到 VIM 可能只通过键盘使用 Putty,但不能反向。在 Windows 的 bash 中 .. 它不可能在任何方向 ATM 上这样做。编制了一份资源清单,为人们指明正确的方向,也为我们..如果您有任何要添加的内容..也许您可以在此处添加它们:stackoverflow.com/questions/45271895/…
          • @alpha_989 later-better-than-never ;) 我无法添加到 jinksPadlock',因为我目前没有 Windows 操作系统。 SHIFT+INS 从 linux 主机到 ssh vim 以及鼠标第三次单击。
          【解决方案12】:

          当我使用未与 Gnome 集成的 Debian vim 时(vim --version | grep clip # 显示不支持剪贴板),我可以在按住 Shift 键并用鼠标选择文本后复制到剪贴板,只需与任何其他诅咒程序一样。正如我从@Conner 的评论中得出的那样,当它感应到我的 Shift 按下时,它是终端(在我的例子中是 gnome-terminal)关闭它的鼠标事件报告。我猜基于 curses 的程序可以在向终端发送某个 Escape 序列后接收鼠标事件。

          【讨论】:

          • 这是在使用你的终端,而不是 vim。
          【解决方案13】:

          如果您在 Windows 上,并且想使用 p 粘贴系统剪贴板的内容,请键入此命令。

          :set clipboard = unnamed
          

          这解决了我的问题。

          【讨论】:

            【解决方案14】:

            可能还值得一提的是,在使用 Vim 的 OSX 上,您可以用鼠标选择文本,Cmd-C 复制到 OSX 系统剪贴板,复制的文本将在 Vim 之外的剪贴板中可用。

            换句话说,OSX 将其视为普通窗口,这就是饱受诟病的 Apple“命令”按钮的用武之地。

            B-30

            【讨论】:

            • 对于任何其他操作系统上的任何半体面的终端模拟器也是如此。苹果在这里没有任何优势。
            【解决方案15】:

            有两种简单的方法可以做到这一点。使您的文件处于插入模式,然后 1)按鼠标中的按钮(滚轮),或 2) Ctrl + Shift + V

            【讨论】:

              【解决方案16】:

              对于某些国际键盘,您可能需要按 "+空格 来获取"

              所以在这种情况下,您必须按 "Space+y"空格*y复制。

              "空格+p" 空格*p 粘贴。

              【讨论】:

                【解决方案17】:

                这对我有用:Ctrl+Shift+V

                【讨论】:

                • @neel 的回答已经说明了这一点。如果您想说它也对您有用,这应该只是一个评论,或者更好的投票。
                【解决方案18】:

                基于@lis2 的回答,我使用了一个更简单的配置,不会在最后强制插入模式:

                " Copy and paste
                if has('clipboard') && !has('gui_running')
                  vnoremap <C-c> "+y
                  vnoremap <C-x> "+d
                  vnoremap <C-v> "+p
                  inoremap <C-v> <C-r><C-o>+
                endif
                

                请注意,所有这些都会覆盖默认的 Vim 映射:

                • v_CTRL-C: 停止可视模式
                • v_CTRL-X:从数字中减去 [count]
                • v_CTRL-V:分块可视化模式
                • i_CTRL-V:按字面意思插入下一个非数字,也映射到i_CTRL-Q

                作为替代方案,可以使用“yank”、“delete”和“put”Vim 动词中启发的键:分别为 &lt;C-y&gt;&lt;C-d&gt;&lt;C-p&gt;。这些只会覆盖一个默认映射:

                • i_CTRL-P:向后搜索关键字完成

                【讨论】:

                  【解决方案19】:

                  如果您在 MAC OSX 中使用 vim,不幸的是它带有较旧的版本,并且不符合剪贴板选项。幸运的是,自制软件可以轻松解决这个问题。

                  安装 vim:

                  brew install vim --with-lua --with-override-system-vim

                  安装vim的gui版本:

                  brew install macvim --with-lua --with-override-system-vim

                  重启终端生效。


                  将以下行追加到~/.vimrc
                  set clipboard=unnamed

                  现在您可以在 vim 中使用 yy 复制该行并将其粘贴到系统范围内。

                  【讨论】:

                    【解决方案20】:

                    如果您想更改 vimrc 等,其他解决方案也不错...不过我想要一种简单的方法来复制 vim 我的系统键盘。这就是我想出的。

                    • 使用可视模式选择要复制的文本v
                    • :(会自动展开显示:'&lt;,'&gt;
                    • 键入y * y +(取决于您的系统)将所选文本拉到系统剪贴板

                    【讨论】:

                      【解决方案21】:

                      你真正需要的是EasyClip。它会做到这一点,还有更多......

                      【讨论】:

                        【解决方案22】:

                        最简单的解决方案是:

                        1. 检查vim是否支持X-11剪贴板:vim --version | grep clipboard。如果它报告了-clipboard-xterm_clipboard,你应该安装vim-gtkvim-gnome(arch linux 上的gvim)

                        2. 将以下行添加到您的.vimrc

                        set clipboard=unnamedplus
                        set paste
                        
                        1. 如果您通过 ssh 在不同的机器上登录,请使用选项 -Y:ssh -Y machine

                        现在复制和粘贴应该可以在单个机器上完全按照预期工作,并且只使用 y 进行 yank 和 p 进行粘贴。注意在你想使用这个功能的所有机器上修改.vimrc

                        【讨论】:

                        • 我认为,X 服务器也应该在服务器中可用,这样才能正常工作。是的!它可能由 vim-gtk 安装。我认为,xvfb 将是运行 X 服务器的替代选项。
                        【解决方案23】:

                        如果你先用鼠标做

                         :set paste 
                        

                        然后right click mouse和缓冲区中的内容将被粘贴

                        【讨论】:

                          【解决方案24】:

                          我认为这个问题应该得到一个更客观、更形象的答案:

                          进入粘贴模式

                          • ESC
                          • :设置粘贴
                          • i
                          • SHIFT + Insert(在剪贴板上复制文本)


                          退出粘贴模式

                          • ESC
                          • :设置不粘贴
                          • i

                          您粘贴了文本,然后可以再次输入。

                          【讨论】:

                          • 我得到了这个工作,但:set nopaste 什么也没做。它应该做什么?为什么我需要它?
                          • 嗯,事实上,确实如此。当您执行:set nopaste 时,您是在告诉编辑器您不想再粘贴了。当您点击i 时,您将返回编辑模式:)。
                          • 老实说,Marko,我不知道。
                          • 这对我来说就像一个魅力。每次我回到 vim 时,我总是不得不看起来像这样。
                          • 你想知道为什么以前没有人能解释得这么简单。
                          【解决方案25】:

                          由于 vim 8 右键默认启用可视模式。这可以防止“正常”复制和粘贴(将其称为“设计缺陷”https://github.com/vim/vim/issues/1326)。 通过这样做来修复它:

                          echo "set mouse-=a" &gt;&gt; ~/.vimrc.

                          退出并重新启动 vim。

                          【讨论】:

                            【解决方案26】:

                            使用 Linux 或 Mac 上的 Vim 8+,您现在可以简单地使用操作系统的本机粘贴(Linux 上的ctrl+shift+V,Mac 上的cmd+V)。不要按i 进入插入模式。

                            它将粘贴操作系统剪贴板的内容,保留空格和制表符而不添加自动缩进。相当于旧的:set pasteictrl+shift+Vesc:set nopaste方法。

                            您甚至不再需要安装 +clipboard+xterm_clipboard vim 功能。此功能称为“括号粘贴”。更多详情请见Turning off auto indent when pasting text into vim

                            【讨论】:

                            • 这需要作为当前正确答案。
                            【解决方案27】:

                            我在 2017 年中的 Macbook Pro 上遇到了这个问题,该 Macbook Pro 在 iTerm2 中运行 vim 作为我的主要开发环境。

                            正如其他答案所暗示的,我运行vim --version 并注意到它返回-clipboard,这意味着我的机器附带的vim 版本尚未使用剪贴板选项进行编译。

                            vimhomebrew 包似乎可以使用 clipboard 选项进行编译,因此我的解决方法是:

                            1. 运行brew install vim
                            2. set clipboard+=unnamed 添加到我的~/.vimrc 文件中
                            3. 关闭并重新打开iTerm2

                            【讨论】:

                              【解决方案28】:

                              复制到操作系统剪贴板

                              在可视模式下选择文本,按"*y

                              从操作系统剪贴板粘贴

                              "*p

                              【讨论】:

                                【解决方案29】:

                                我使用了 NM Pennypacker 的答案,并通过自制软件为 2011 年初的 MacBook Pro 安装了 vim:

                                brew install vim
                                

                                现在我还可以使用 "* 寄存器在 vim 中复制和粘贴文本。我什至不必更改 ~/.vimrc 文件或 $PATH 中的某些内容。Homebrew 在 /usr/local/ 中添加了符号链接bin,例如 vim -> ../Cellar/vim/8.1.2350/bin/vim.

                                以前可行的替代方法是在 vim 中复制一些文本行,方法是用鼠标标记它并在 mac 上使用复制和粘贴 (cmd + c, cmd + v)。此选项仅在您要复制和粘贴的文本大小小于 vim 的窗口大小时才有效。如果你想通过标记整个窗口或使用cmd + a来复制vim中的所有文本,这将复制控制台的其他部分,在启动vim之前编写,这很烦人。

                                所以,我很高兴找到了使用剪贴板寄存器的新方法。

                                【讨论】:

                                  【解决方案30】:

                                  如果你有它,试着从你的 vimrc 中删除它: 设置鼠标=a

                                  它与粘贴功能混淆。

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 2023-04-08
                                    • 1970-01-01
                                    • 2014-03-08
                                    • 2018-12-09
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多