问题

如何将 Vim 剪贴板里面的东西粘贴到 Vim 之外的地方?

回答
想要把 Vim 里复制( yank )的内容粘贴到 Vim 之外的任何地方,这其实比很多人想象的要简单一些,主要是因为 Vim 内置了一个非常强大的机制来与系统的剪贴板进行交互。理解了这个核心机制,你就能轻松实现这个需求了。

核心概念: Vim 的寄存器(Registers)

在 Vim 中,当你进行复制(yank)操作时,内容并不会凭空消失,而是被存放在一个叫做“寄存器”(register)的地方。Vim 有很多种不同类型的寄存器,但对于我们今天讨论的问题,最关键的寄存器是:

`""` (星号寄存器): 这是 Vim 中最常用的一个寄存器,它直接指向系统的剪贴板(clipboard)。当你将内容复制到系统的剪贴板时,Vim 的 `""` 寄存器就会同步这个内容。反过来,当你从 `""` 寄存器粘贴时,Vim 会从系统的剪贴板读取内容。
`"+"` (加号寄存器): 在一些系统(尤其是 X11 系统,比如 Linux 的 GNOME、KDE 等桌面环境)上,`"+"` 寄存器也指向系统的剪贴板,与 `""` 寄存器的作用非常相似,甚至常常是同一个剪贴板。在某些情况下,`"+"` 可能提供更广泛的支持,但绝大多数情况下,`""` 就足够了。

如何确定你的 Vim 是否支持系统剪贴板?

这是最重要的一步。如果你的 Vim 版本没有编译进对系统剪贴板的支持,那么无论你做什么,都无法将内容粘贴到 Vim 之外。

在 Vim 中,你可以执行 `:version` 命令。在输出的列表中,查找 `+clipboard` 或 `+xterm_clipboard`。

`+clipboard`: 表示 Vim 编译时就包含了对系统剪贴板的完整支持。这是我们最希望看到的结果。
`+xterm_clipboard`: 在某些情况下,Vim 可能只支持 Xterm 剪贴板,这通常在终端环境中使用。它可能与系统剪贴板不完全一致,但也值得尝试。
`clipboard`: 如果看到的是 `clipboard`,那就说明你的 Vim 版本不支持系统剪贴板。在这种情况下,你需要安装一个支持剪贴板的 Vim 版本。

安装支持剪贴板的 Vim:

Linux (Debian/Ubuntu):
```bash
sudo apt update
sudo apt install vimgtk3 或者 vimgtk, vimgnome, vimathena
```
`vimgtk3` 通常会提供完整的剪贴板支持。

macOS:
如果你使用 Homebrew:
```bash
brew install vim withoverridesystemvim withclipboard
```
然后确保你的 `PATH` 环境变量指向新安装的 Vim。

Windows:
从 Vim 官方网站下载安装程序时,确保选择的是带有 GUI 或者支持剪贴板的版本。

将 Vim 内容粘贴到 Vim 之外的步骤:

一旦你确认你的 Vim 支持系统剪贴板,操作就非常简单了。

1. 在 Vim 中复制(Yank)内容:
复制整行: 将光标移动到你想复制的那一行,按下 `yy`。
复制多行: 将光标移动到开始行,按下 `V`(大写 V)进入可视模式(行选择),然后移动光标选择你想要复制的行,最后按下 `y`。
复制指定范围: 将光标移动到你想复制的开始位置,按下 `v`(小写 v)进入可视模式(字符选择),然后移动光标选择你想要复制的内容,最后按下 `y`。
复制到寄存器: 如果你想确保内容被复制到系统剪贴板,你可以显式地使用 `""` 寄存器:
复制整行到系统剪贴板:`"yy`
复制多行到系统剪贴板:`V` 进入行选择模式,移动光标,然后按 `"y`。
复制当前单词到系统剪贴板:`"yiw` (yank inner word)

重要提示: 如果你的 Vim 默认配置就是将 `""` 寄存器与系统剪贴板关联,那么直接使用 `yy` 这样的命令,复制的内容也会自动进入系统剪贴板。你可以通过 `:set clipboard?` 来查看当前剪贴板的设置。理想的输出是 `clipboard=unnamedplus,unnamed`。如果不是,你可以通过在你的 `~/.vimrc` 文件中添加 `set clipboard=unnamedplus` 来设置。这样,你所有的 yank 和 delete 操作都会自动同步到系统剪贴板。

2. 切换到 Vim 之外的应用程序:
Windows: 按 `Alt + Tab`。
macOS: 按 `Cmd + Tab`。
Linux: 通常是 `Alt + Tab` 或 `Super + Tab` (Super 键通常是 Win 键)。
或者直接用鼠标点击目标应用程序的窗口。

3. 粘贴内容:
在目标应用程序中,使用该应用程序的粘贴快捷键。
Windows: `Ctrl + V`
macOS: `Cmd + V`
Linux: `Ctrl + V` (在大多数应用程序中)

更进一步:从 Vim 外部复制内容到 Vim

这个过程正好相反。如果你在浏览器、文档编辑器或其他任何地方复制了一些内容,想将它粘贴到 Vim 中:

1. 在 Vim 中进入插入模式: 按 `i`。
2. 粘贴内容:
使用系统粘贴快捷键: `Ctrl + V` (Windows/Linux) 或 `Cmd + V` (macOS)。
使用 Vim 的粘贴命令 (推荐): 退出插入模式,按 `p`。如果你的 `clipboard` 设置正确(如前所述),Vim 会自动从系统剪贴板获取内容。如果想明确指定,可以按 `"p` 来粘贴系统剪贴板的内容。

使用 `""` 和 `"+"` 寄存器的其他场景

复制 Vim 中的内容到 Vim 的另一个缓冲区:
如果你想复制当前 Vim 窗口的内容到另一个 Vim 窗口,可以使用 `""` 寄存器,就像你要粘贴到 Vim 之外一样。
例如,在一个 Vim 窗口中复制:`"yy`
然后切换到另一个 Vim 窗口,进入插入模式(`i`),然后粘贴:`Ctrl + V` (或者 `Cmd + V`),或者直接粘贴 `"p`。

从 Vim 外部的文本粘贴到 Vim 的指定位置(不通过系统剪贴板):
如果你想直接将系统剪贴板(例如,在 Windows 上用 `Ctrl+C` 复制的文本)粘贴到 Vim 的某个特定位置,并且不希望它影响 `""` 寄存器,你可以使用 `"+"` 寄存器(如果你的 Vim 支持的话)。
在 Vim 中,进入插入模式:`i`
粘贴:`Ctrl + R + "+"` (`Ctrl + R` 是 Vim 中用于插入寄存器内容的命令,`"+"` 是指系统剪贴板)
或者
在 Vim 的普通模式下,粘贴:`"+p`

总结一下,如果你想把 Vim 里的东西粘贴到 Vim 之外:

1. 确认 Vim 支持剪贴板(`:version` 查找 `+clipboard`)。
2. 在 Vim 中复制内容(`yy` 或 `"yy`,或可视模式下 `y` 或 `"y`)。
3. 切换到目标应用程序。
4. 在目标应用程序中使用其粘贴命令(`Ctrl + V` 或 `Cmd + V`)。

如果这一切都不奏效,那很可能是你的 Vim 版本不支持剪贴板,需要安装一个新版本。希望这个详细的解释能帮助你顺利完成在 Vim 与其他应用之间的数据交换。

网友意见

user avatar

根据平台不同,要分两种情况。先用下面命令确定你属于哪一种,

       vim --version | grep clipboard     


情况一,

如果结果里你找到加号开头的+clipboard, 恭喜你,你的vim没问题,是你姿势问题。

  • "+y 代替y将选中的内容复制到系统剪贴板,效果和ctrl-c一致。
  • "+p代替p将剪贴板内容复制到指定位置,也可以用ctrl-v

dxcs也一样,用之前前面加"+

如果想偷懒用y直接把内容复制到系统剪贴板,需要到vim配置文件.vimrc里加一行属性。用下面命令开始配置,

       vim ~/.vimrc     

然后,加入下面这行,

       set clipboard=unnamed     

现在你的ydxp已经能和 ctrl-cctrl-v 一个效果,并且能互相混用。


情况二,

如果找到的是负号开头的-clipboard说明你的vim不支持系统剪切板,我的MacOS系统自带vim就不支持,所以跑来了。需要先重新安装vim,

Linux系统,

       sudo apt install vim-gtk     

MacOS,

       brew install vim     

安装好之后,重复情况一的操作即可。



问题解决了,有几个细节再解释一下,满足一下好奇心。

首先,vim里ydxc复制,剪切下来的内容临时存放在一个叫vim寄存器(Register)的地方。而且寄存器有好几个。下面vim命令可以看到寄存器列表,

       :reg     

最常用的默认寄存器""未命名寄存器(unnamed register)。最近一次删除,修改,复制内容统统暂存这里(会覆盖,只保留最近一次任意操作)。感兴趣的同学可以看下表,其他寄存器都是干什么的。

       ""      // 默认unnamed寄存器,最近一次"d","c","s","x","y"复制,删除,修改内容  "0      // 最近一次"y"复制内容  "1      // 最近一次"d","c","s","x"删除,修改内容 "2     //  上一次"d","c","s","x"删除,修改内容 "3     // 上上次"d","c","s","x"删除,修改内容 ...      "9      // [1-9]数字以此类推   "a     // 字母寄存器,供用户指定使用,比如"ay就是复制到"a寄存器 "b ... "z   "-      // 少于一行的"d","c","x"删除内容  ".      // 只读寄存器 ":      // 只读寄存器 "%     // 只读寄存器 "#     // 只读寄存器  "+      // 映射系统剪贴板 (有的默认设置不支持) "*      // 映射系统剪贴板 (有的默认设置不支持)     


ctrl-c以及ctrl-v用到的是系统剪贴板(system clipboard)vim寄存器和系统剪贴板不是一个东西。顾名思义,vim寄存器的数据作用域仅限于vim本地,甚至如果开多个vim窗口,每个窗口都有一套自己完整的寄存器,互相不影响。而系统剪贴板作为系统级别的全局变量,两边当然不能混用。

所以vim专门提供了"+寄存器作为对系统剪贴板的映射。可以理解成自动把"+寄存器的内容再复制一份到系统剪贴板,前提是你得把clipboard属性设置成打开。有些版本(比如MacOS自带的vim)就不支持这个映射。重装vim就是为了打开这个开关。(如果有简便的直接改设置方法,请纠正我)。打开以后用"+y命令把内容复制到和系统剪贴板关联的寄存器"+上。而y只是复制到默认无名寄存器""上。

最后set clipboard=unnamed就是把默认无名寄存器"" 和系统剪贴板也关联上。 就是用y也可以备份到系统剪贴板。缺点是破坏了默认寄存器""的本地性。因为p操作也会被等同于"+p处理,粘贴的是"+寄存器的内容, 粘贴的时候""默认寄存器内容就会被覆盖。 表现出来的就是复制一次,到任意vim窗口都可以粘贴。但这个特性恰恰是很多人想要的。

还有个细节,大部分系统上"+"*是等价的。但在有的系统上不等价,比如Linux,

  • "+:对应ctrl-cctrl-v用到的系统剪贴板:desktop clipboard (XA_SECONDARY)
  • "*:对应图形界面中鼠标框选的内容(可以用鼠标中键黏贴):X11 primary selection (XA_PRIMARY)

所以看到"*也不要慌,试试看用"*y"*p能不能复制粘贴。可以的话就说明是混用的,不行就老老实实用"+


以上。遇到此坑的同学了解一下。


参考文献:

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有