如何使vim粘贴(和复制)到系统剪贴板?

1080

不同于其他编辑器,vim会将复制的文本存储在自己的剪贴板中。因此,我很难从网页上复制一些文本并将其粘贴到当前工作的文件中。所以我要么得打开gedit,要么手动输入。

我能否让vim从系统剪贴板复制和粘贴呢?


11
可能是如何使用vim复制到剪贴板?的重复问题。 - BuZZ-dEE
8
“复制”+y、“粘贴”+p的用法与“拷贝”和“粘贴”类似,但你需要在操作前指定注册表。 - Banjocat
2
要使用以下命令,请确保您已经执行了sudo apt-get install vim-gnome,这将为内置的vim添加使用系统剪贴板的功能。 - Harnirvair Singh
2
对于这里的许多读者来说,vim-gnome 可能过于复杂或在他们的操作系统/发行版中不可用,而我怀疑 vim-gtk 和最好是 vim-gtk3 更有可能存在并拉取更少的依赖项,同时仍提供剪贴板集成(至少对于那些仍在使用 X11 的人;我不确定这一切与 Wayland 如何交互)。 - underscore_d
3
在 Fedora 上默认情况下不能访问剪贴板(您需要 gvim)。有关在 Fedora 上安装支持剪贴板的 Vim 的详细信息,请参阅 https://superuser.com/questions/194747/how-to-install-vim-with-clipboard-support-on-fedora。 - icc97
显示剩余7条评论
38个回答

1139

简短版

尝试使用"*yy"+yy将一行复制到系统剪贴板。

完整回答

请注意,如果:echo has('clipboard')返回0,则无法从系统剪贴板复制/粘贴。在这种情况下,vim未编译为具有+clipboard功能的版本,您需要安装其他版本或重新编译。一些Linux发行版默认提供最小化的vim安装,但如果您安装vim-gtkvim-gtk3软件包,您仍然可以获得额外的功能。

"

“*”和“+”寄存器用于系统的剪贴板(:help registers)。根据您的系统,它们可能会执行不同的操作。例如,在不使用像OSX或Windows这样的X11系统上,“*”寄存器用于读取和写入系统剪贴板。在X11系统上,这两个寄存器都可以使用。有关更多详细信息,请参阅:help x11-selection,但基本上,“*”类似于X11的_PRIMARY_选择(通常复制您用鼠标选择的内容,并使用中间鼠标按钮粘贴),而“+”类似于X11的_CLIPBOARD_选择(即剪贴板本身)。

如果您对此一无所知,请尝试使用“*yy”或“+yy”将一行复制到您的系统剪贴板。假设您具有适当的编译选项,其中一个应该起作用。

"
你可能想要将其重新映射为更方便的操作。例如,你可以在你的~/.vimrc文件中添加vnoremap <C-c> "*y,这样你就可以通过可视选择并按下Ctrl+c将内容复制到系统剪贴板。
你还可以查看'clipboard'选项,在:help cb中有详细描述。在这种情况下,你可以使用: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

164
这很有用,但您能否总结一下需要进行哪些按键操作才能从系统剪贴板中粘贴...例如,使用“*p”时要做什么?我是按Shift-',然后Shift-8,然后p等吗? - T. Brian Jones
19
在vim中,许多命令都使用“操作待定模式”,即按下一个键后vim等待更多按键。以“dd”为例,第一个“d”进入操作待定模式,然后第二个“d”完成命令并删除该行。但是如果您键入“dG”,则“G”会使其删除到文件末尾而不仅仅是删除该行。寄存器也使用此原理,允许各种命令使用它们。请按顺序输入这三个字符。 - Conner
68
重点提示:您需要安装vim-gtk软件包(至少在Debian下),才能获得已编译具有+xterm_clipboard选项的vim。我花了40分钟才找到这个,但只需几秒钟的时间就可以执行“sudo apt-get install vim-gtk”命令安装它。 - Dominykas Mostauskis
3
vim-gnome 也可以使用,并且启用了 +xterm_clipboard - Chev
3
谢谢,这非常有用。我想补充一点,如果你的发行版没有像“vim-gtk”这样的东西,你可能在寻找一个叫做gvim的软件包。 - WhyNotHugo
显示剩余24条评论

320
你可以使用gnome-terminal的粘贴快捷键将内容粘贴到vim中。在插入模式下放置文件并使用Ctrl+Shift+v。 事先请记得:
 :set paste 
为了避免搞乱缩进。

22
如果像Python的for循环一样有多行,这会使缩进混乱。 - Moj
15
在插入模式下使用粘贴切换键,例如设置 pastetoggle=<F2>。然后在插入模式下,按下<F2>,然后插入你的Python代码。 - Jan Weitz
1
如果通过listchars选项显示制表符/空格、行尾等不可见字符,则将复制这些替换字符而非隐藏字符。 - Dmitry Koroliov
3
鉴于其简洁的回答,这应该是被选中的答案。 - Aidin
4
更新 Vim 8+(Linux 和 Mac)后,只需在普通模式下执行系统黏贴即可。不再需要插入模式或 :set paste 命令。https://dev59.com/iGgu5IYBdhLWcg3wOUgk#57085290 - wisbucky
显示剩余2条评论

152
我认为这个问题应该得到一个更客观和图解的答案: 进入粘贴模式
  • ESC
  • :set paste
  • 按下 i
  • SHIFT + Insert(将要复制的文本复制到剪贴板中)

退出粘贴模式
  • ESC
  • :set nopaste
  • 按下 i

您已经粘贴了文本,可以开始输入。


3
我已经成功让它运行了,但是:set nopaste没有起作用。它是干什么用的?我需要它吗? - Marko Avlijaš
3
实际上它确实有用。当你执行:set nopaste时,您告诉编辑器您不再想要粘贴文本。而当您按下i键时,您将返回到编辑模式 :)。 - ivanleoncz
4
老实跟你说,马尔科,我不知道。 - ivanleoncz
3
这对我来说起了很好的作用。每次回到 Vim 编辑器,我总是需要查找类似这样的东西。 - benjaminadk
4
你想知道为什么以前没有人能像现在这样简单易懂地解释这个问题。 - Jan Mirus
显示剩余6条评论

56

对于我而言,那个配置可以实现复制和粘贴

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

你粘贴到了什么地方? - StarWind0
2
在我看来,这是一个比将剪贴板设置为未命名更好的解决方案——不要在每个x/dd/y等操作中干扰操作系统剪贴板。在Mac上,将C(ctrl)修改键更改为D,以映射cmd+c/x/v组合可能是一个更好的想法。 - mindex

48

这是你在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

2
我喜欢你的解决方案。我想要一个更好的解释。 - zhon
使用寄存器总是让我犹豫和思考,这样做好多了。 - JonnyRaa
我的 vim 版本带有 +clipboard,但这个选项对我不起作用。我正在使用 Byobu(它在底层使用 Tmux)。 - GGhe
我不得不为 Fedora 添加 set clipboard+=unnamedplus。 - hakunin
要理解 set go+=a,请阅读 https://vimhelp.org/options.txt.html#'guioptions' - Brandon

46

Linux

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

具体细节似乎与配置和系统有关,因此您的体验可能会有所不同。但这肯定会让你朝正确的方向前进。

另请参阅

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


3
只有 "*" 映射到 X11 的主寄存器(通常由鼠标粘贴)。"+" 映射到 X11 剪贴板寄存器,通常通过快捷键进行粘贴。 - ZyX
@ZyX 在我的系统上没有出现过这种情况,但你的情况可能会有所不同。如果你想在各个平台和软件版本中获得一致的体验,最好明确地配置你想要的行为。 - Todd A. Jacobs
1
我认为这意味着你有类似 klipper/glipper 的剪贴板管理器,它们能够同步两个缓冲区。这并不改变 vim 使用 * 作为主要的,使用 + 作为 X11 剪贴板寄存器的事实,你可以在 vim 源代码中看到:这些 值在那里设置并且从未被修改,而 clip_starclip_plus 分别始终用于 *+ 寄存器。 - ZyX

28

Shift + 右键单击 -> 粘贴

对我很有效。


复制怎么样?(它看起来被禁用了) - Pathros
@Pathros 如果你先高亮一些文本,然后按住 Shift 键并右键单击,它将被启用(至少在我的 Ubuntu 20.04 终端中)。 - java-addict301
在我的Ubuntu 22.04中,我使用"shift + v"进入可视模式,然后我选择要复制的行,但当我使用"shift + 右键单击"时,在菜单中,复制选项被禁用了。为什么?我错过了什么吗? - Pathros
@Pathros 我没有使用可视模式,但它对我来说完全正常(在VIM内或其他情况下)。 - java-addict301
我不需要按住 Shift 键就能让这对我起作用。我只需在终端中右键单击,然后选择“粘贴”,它会将文本放置在光标所在位置。 - neuquen
1
这个答案需要更多的关注,因为它在 vim-tiny 中特别有效,而 vim-tiny 没有剪贴板功能。确保你处于插入模式,但不是可视模式。 然而,我也似乎无法让复制工作。 - undefined

27

剪贴板

有一个特殊的寄存器用于存储这个选择,它是“*”寄存器。除非所选文本的信息即将更改(例如通过单击鼠标左键),或者其他应用程序想要粘贴所选的文本,否则不会放入其中任何内容。然后将文本放入“*”寄存器中。例如,要剪切一行并使其成为当前选定项/将其放在剪贴板上:

    "*dd

同样地,当你想从其他应用程序中复制内容,例如通过单击鼠标中键时,选择会首先被放入“*寄存器”,然后像任何其他寄存器一样进行“put”操作。例如,要放置所选内容(即CLIPBOARD的内容):
    "*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、SECONDARY和CLIPBOARD。常规上,PRIMARY选择用于通过中间鼠标按钮实现复制和粘贴。SECONDARY和CLIPBOARD选择由应用程序较少使用。”

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


17

复制到操作系统剪贴板

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

从操作系统剪贴板粘贴

按下"*p


14

由于没有剪贴板,因此我想出了这个使用xsel的替代方案:

将以下内容添加到您的~/.vimrc中:

vnoremap <C-C> :w !xsel -b<CR><CR>


1
谢谢这个好主意!我最终使用了: vnoremap <C-C> :w !xclip -i -sel c<CR><CR> - andy
这很有效,xsel和xclip都可以使用,但是可视选择会扩展到整行。然而,按两次C-C就可以正常工作!我不知道为什么... - nickkzl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接