如何在Vim中复制到剪贴板?


752

可以直接从Vim复制到剪贴板吗?yy仅将内容复制到Vim的内部缓冲区。我想复制到操作系统的剪贴板。Vim中是否有这样的命令,或者您只能在Vim中拉东西?


139
请查看投票不足的答案,该答案阐明了一个重要的事实:必须使用+ clipboard功能编译vim才能使以下任何建议首先生效!在大多数系统上,这不是默认设置。
尼尔·特拉夫特

7
@NeilTraft,一些答案建议从vim到外部程序,因此任何说法都需要+ clipboard标志的说法是错误的。只是指出要避免将来的读者感到困惑。
赫纳特2014年

2
如何从系统剪贴板粘贴(并复制到)vim的可能重复项(请注意:另一个问题较新,但是恕我直言,我的回答是更好的答案,我为什么将其标记为欺骗)
Martin Tournoij 2016年

5
请确保您已完成 sudo apt-get install vim-gnome 以下操作,然后在下面应用这些命令,否则您将收到无效注册错误!
Harnirvair Singh

7
@Harnirvair对于这里的许多读者来说,vim-gnome可能是矫kill过正,或者只是在他们的OS /发行版中不可用,而我怀疑vim-gtk并且最好vim-gtk3是存在的可能性更大,并减少依赖,同时仍然提供剪贴板集成(至少对于仍在X11上的用户)。我不确定这一切与Wayland如何互动。
underscore_d

Answers:


496

*寄存器将做到这一点。在Windows中,+而且*是等价的。在UNIX中,+和之间有细微的差别*

在Windows下,*和+寄存器是等效的。但是,对于X11系统,它们有所不同。对于X11系统,*是选择项,而+是剪切缓冲区(如剪贴板)。 http://vim.wikia.com/wiki/Accessing_the_system_clipboard

*可能是您大多数时候想要的,所以我使用*它,因为它在两种环境中都能发挥预期的功能。

在Linux发行版中,您必须先安装vim-gtk(aka gvim)才能获得剪贴板功能。这是因为非gtk vim通常在没有X11支持的情况下进行编译。这是为了使其能够在仅控制台计算机(通常是服务器)上运行。

对于那些对于在拉动或放置时如何使用寄存器感到困惑的人,只需写下"寄存器的名称即可。因此,要将内容复制到剪贴板中,请先键入内容"*y,然后再键入内容"*p(来源:Kyle Mathews)


31
在Mac OS X Lion上不起作用。按“然后*”后,当您无法执行某些操作时,它将发出Mac发出的声音。如何在Mac上执行此操作?
Eddy

62
您还必须确保在编译Vim时支持剪贴板。Ubuntu中的默认vim不是。请尝试vim --version|grep .xterm_clipboard -o,如果不是,-那么您将没有支持。根据ubuntuforums.org/showthread.php?t=1686955
Sparhawk

66
如果您使用的是Linux,则应+注册。例如,如果要将三行复制到系统的剪贴板中,请使用命令,例如v3j"+y,然后可以将它们粘贴到另一个VIM中的另一个应用程序中。*在Linux下使用register只能在不同的VIM应用程序之间复制和粘贴。
diabloneo

6
在Linux上,*寄存器不适用于外部复制和粘贴。
weberc2

11
weberc2和diabloneo,*寄存器用于选择剪贴板,可通过单击鼠标中键而不是菜单粘贴或^ V进行访问
Jim Keener 2013年

354

在Mac OSX上

  • 复制所选部分:直观地选择文本(键入vV在正常模式下)并键入:w !pbcopy

  • 复制整个文件 :%w !pbcopy

  • 从剪贴板粘贴 :r !pbpaste

大多数 Linux发行版上,您可以替代:

  • pbcopy上面带有xclip -i -sel cxsel -i -b
  • pbpaste使用xclip -o -sel -cxsel -o -b
    - 注意: 如果发行版中未预先安装这些工具(xselxclip),则可能会在存储库中找到它们

1
+1与Lion合作,但vim --version显示-clipboard
roplacebo

26
与mavericks osx随附的vim兼容。添加到.vimrc vnoremap <C-c> :w !pbcopy<CR><CR> noremap <C-v> :r !pbpaste<CR><CR>要使用此映射,如果要复制,请在可视模式下突出显示文本,然后按Ctrl-c进行复制。要从系统剪贴板粘贴,请按Ctrl-v。
davidtingsu 2014年

7
在Linux上,它可以与:w!xclip -sel c或:w!xsel -b一起使用
trve.fa7ad 2015年

4
对于Linux Ctrl + C复制:〜/ .vimrc中添加:vnoremap <C-C> :w !xclip -i -sel c<CR><CR>
andy

3
比被接受的答案有用得多的答案。谢谢!
布莱斯·约翰逊

165

在vimrc文件中,您可以指定自动使用系统剪贴板进行复制和粘贴。

在Windows上设置:

set clipboard=unnamed

在Linux上设置(vim 7.3.74+):

set clipboard=unnamedplus

注意:您可能需要使用Vim的最新版本才能使它们工作。

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


39
作为笔记的附录-您可能还必须安装其他软件包才能使它起作用。如果您的vim缺少该+xterm_clipboard功能(运行时可见vim --version)。对我来说就是这样(运行Kubuntu 12.10)。我必须安装该vim-gui-common软件包才能获得正确的功能。
2013年

4
set clipboard=unnamed可以在带有vim 7.4的Mac OS 10.11.6(El Capitan)中使用
Purplejacket '16

1.拖动复制2.鼠标选择,可在Mac Sierra-10.12.6和vim-version:8.0.1800中运行,方法是在〜/ .vimrc文件set mouse=vset clipboard=unnamed
–dkb中

set clipboard=unnamed在MacOS Catalina上工作
Diego Somar

您可能希望更新您的答案。它在带有vim 8.0的Ubuntu 18.04上不起作用。
路易斯·德索萨

124

使用寄存器"+复制到系统剪贴板(即"+y代替y)。

同样,您可以从中粘贴"+以从系统剪贴板获取文本(即"+p代替p)。


我用“*,但似乎有一个只有十中的差异
划线汤姆榜

3
@ dash-tom-bang:+/ *区别在于SELECTIONvs PRIMARY复制缓冲区(不记得是哪个atm)
Daenyth 2010年

2
是的,是星号,是剪贴板。
dash-tom-bang 2010年

6
双引号字符用作vi和vim中的寄存器选择器。
Amardeep AC9MF

1
记住两套快捷方式:("+yy将行复制到剪贴板)和"+yy(将行复制到选择);"+p(从剪贴板粘贴)和"*p(从选择粘贴)。"是选择默认情况下是vim自己内部寄存器的寄存器(这种方式yy并且p可以在不引用任何类型的寄存器的情况下工作)。PS:我想知道Vim自己的内部寄存器是否有一个字符,例如默认情况下"&yy会变为yy

72

@Jacob Dalton在评论中提到了这一点,但似乎没有人在回答中提到过,必须使用剪贴板支持编译vim才能使此处提到的任何建议起作用。在Mac OS X上,默认情况下,我的配置不是这样的,因此我不得不重建vim。使用此命令来查找您是否拥有它vim --version | grep 'clipboard'+clipboard表示您很好,并且这里的建议将对您-clipboard有用,同时意味着您必须重新编译和重建vim。


15
或者,您可以安装已通过剪贴板支持构建的vim软件包,而无需自己编译。在OS X上,自制软件具有:brew install vim。在Ubuntu上,您可以使用sudo apt-get install vim-gnome。在其他(非GNOME)Linux发行版上,您可能宁愿安装vim-gtkvim-athena
尼尔·特拉夫特

3
谢谢,在Arch Linux中,我不得不删除vim并安装gvim wiki.archlinux.org/index.php/Vim#Installation
michalzuber 2015年

您的答案是在解释为什么yank不能与剪贴板一起使用,仅凭您的信息,我就可以做一个更好的Google搜索并使它轻松工作。现在可以正常工作了。最好在您的答案中包含@NeilTraft评论,这样人们就不必进行Google搜索了。
Yana Agun Siswanto,

在Mac上,在brew install vim我添加set clipboard=unnamed到.vimrc之后。source ~/.vimrc在命令行中运行。在.bash_profile中,我添加了alias vim="/usr/local/bin/vim"然后运行source ~/.bash_profile。现在在vim中,只需使用yp复制/粘贴
Dmitry

59

总结一下,让新手更容易,

要复制当前行,请在命令模式下键入:

"*yy

要复制整个文件/缓冲区,请在命令模式下,首先通过进入开头gg,然后键入

"*yG

如前所述,这需要+clipboardout中的vim --version,表示剪贴板支持的可用性,-clipboard表示否。


1
"*5yy说,5 lines yanked但剪贴板什么都没有?操作系统/ x。
javadba

2
是的,我已经验证了+ clipboard
javadba

nnoremap <leader>c "* in .vimrc可以很好地用作各种“副本”,然后执行动作以将要复制的文本对象捕获到OS剪贴板中。
cpk

谢谢,您正是按照我的需要说明了它。
Symen Timmermans

3
我安装vim-gtk-clipboard变成+clipboard,无法"+yy正常工作。
Lai32290

30

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

安装vim:

brew install vim

安装vim的gui版本:

brew install macvim

重新启动终端以生效。


将以下行添加到〜/ .vimrc
set clipboard=unnamed

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



更新方法

多年来我对设置剪贴板方法从未感到满意。最大的缺点是,即使x用于删除,它也会弄乱剪贴板的历史记录。这是一个更好,更优雅的解决方案。

  1. 将vim的文本[range]复制到系统剪贴板中。(提示:首先使用vV选择范围,然后键入冒号:以激活Ex命令):
    :[line-range]yank +
    例如,
    :5,10y * (将5-10行复制/拖动到系统剪贴板*寄存器中)

  2. 将系统剪贴板中的内容粘贴到新行的vim中:
    :put +

注意:

  1. 如果选择单词范围,则以上操作将无效。使用“ * y”“ + y”将此可视块保存到剪贴板。但是,这很难键入,我仍在考虑替代方案。
  2. :help“ * :help * +了解更多信息
  3. brew info vim将能够看到安装vim的其他选项。目前,它没有其他选择。

--with-override-system-vim应该是--with-override-system-vi
maffo

我想尝试这样做,以避免在最小的系统上安装很多Xorg东西,但是我却缺少一些东西。在v模式下选择然后按“:”后,出现“不是编辑器命令[range] yank +”。
jeremyjjbrown

29

对于Ubuntu-2018年7月

使用寄存器“ +”复制到系统剪贴板(即“ + y而不是y”)。

同样,您可以从“ +”粘贴以从系统剪贴板中获取文本(即“ + p而不是p”)。

您还必须确保在编译Vim时支持剪贴板。尝试:

vim --version | grep .xterm_clipboard -o 

如果它是-xterm_clipboard(减号前缀),那么您就没有支持。

以下是一些有关使用剪贴板支持的工作版本的vim的说明。

  • $ sudo apt-get purge vim
  • $ sudo apt-get autoremove(从系统中删除所有无关的vim依赖包)
  • $ sudo apt-get install vim-gnome

再次检查vim --version | grep .xterm_clipboard -o,您可以确认剪贴板现在可用(即+ xterm_clipboard

祝好运。


3
你是我的一天,或者是我的月份。在Ubuntu上使用无剪贴板vim进行了多年努力之后,这是一种了不起的感觉。arcseldon,谢谢!
evanrmurphy '18 -10-10

除了上述的相同,我不得不把set clipboard=unnamedplus我的.vimrc文件为猛拉工作。我正在使用Ubuntu 18.04。
伊莱贾

23

我无法复制到剪贴板的系统,因为我的〜/ .vimrc文件中包含以下文件:

 if has('mouse')
   set mouse=a
 endif

但是,如果您接下来添加此行,它将允许您简单地Ctrl+c将选择的内容放入剪贴板。

vmap <C-c> "+y

原始讨论和更多详细信息:在启用set mouse = a的情况下从vim复制文本


3
我没有将行添加到.vimrc中,但是您提供的链接非常有用。如果在选择vim中的文本时按住SHIFT键,则可以在不进入可视模式的情况下复制文本。因此,谢谢并+1。
Stefan van den Akker,

换档把戏是我所需要的。与终止器之类的编辑器配合使用也很好,它们在提示符下使用Ctrl + Shift + c进行复制,这是我最初尝试的。我确实在vim上安装了-xterm_clipboard。
Anders Elmgren

18

对我来说,解决方案是安装包含剪贴板选项的其他vim: 

sudo apt-get install vim-gnome

3
这就是我为Ubuntu 16.04要做的事情。我尝试了其他建议,但没有成功。这是最简单的,做什么,我希望用“+ Y。
史蒂芬Eckhoff

无需任何vimrc更改,它就像一个魅力!在Ubuntu 16.04中仍然有效
makerj

"+y建议仅适用于vim-gnome。使用Linux Mint 18.2。
Samaursa

14

如果您使用的是GVim,也可以set guioptions+=a。这将触发您将以可视模式突出显示的文本自动复制到剪贴板。
缺点:请注意,在这种情况下,高级剪贴板管理器(带有历史记录)将获得您所有的选择历史记录…


13

你可以在这里找到答案 Arch Wiki

对于Linux:首先,您必须通过安装在vim版本中启用Clipboard gvim


接下来,您必须将此行放在.vimrc文件上。

set clipboard=unnamedplus


+1,很惊讶现在需要执行此步骤。在以前的所有Arch安装中,我都不需要这样做。
Konstantinos

也为ubuntu 18.04工作,并在tmux中运行。谢谢!
詹姆斯·克莱因

10

如果您的vim碰巧没有+xterm_clipboard选项被编译,例如Debian中的默认设置,我想是Ubuntu,那么您可以将选择内容或整个缓冲区传递给处理桌面剪贴板的外部程序。对于xclip(您可能需要事先安装),该命令将是:w !xclip -sel clip


1
感谢您的支持-多年来,它在Ubuntu上没有为我工作(因此确认您的Ubuntu猜测是正确的),我也不知道为什么。现在,我可以-xterm_clipboard在显示的标志中看到我vim --version
jamesc 2014年

这帮助我找到了剪贴板支持的良好来源:vimcasts.org/blog/2013/11/getting-vim-with-clipboard-support
jamesc 2014年

9

仅在Ubuntu终端下的vim中,

按下shift + drag mouse以选择vim中的文本,然后ctrl + shift + c在终端上

然后ctrl + v在其他编辑器上


3
这样可以只选择vim中可见的内容,如果要选择整个文件怎么办?
Gerep

@Gerep此方法不适用于整个文件选择。最好仅在vim终端上选择文本的一部分,并在终端屏幕上显示文本的地方。
Supawat Pusavanno

1
这将复制行号,拆分的缓冲区边界以及所有可见的内容,而不仅仅是文本/代码。
Zelphir Kaltstahl,2013年

9

如果您使用xclip,则将文本复制到剪贴板的简单方法如下:

  1. 提取您要复制的文本。(y香草vim中的命令)
  2. 输入 :call system("xclip -selection clipboard", @")

:call system()运行终端命令。它带有两个参数,第一个是命令,第二个是传递给该命令的内容。例如,:echom system("head -1", "Hello\nWorld")返回Hello(带有一些填充)。echom返回命令的输出,调用不返回。

xclip -selection clipboard 只需将文本复制到系统剪贴板中即可,而不是使用默认的X剪贴板(通过中间的Moue按钮访问)。

@"返回最后被选中的文本。“是默认寄存器,但是您可以使用任何寄存器。要查看所有寄存器的内容,请键入:registers


2
这更加健壮,即使不符合vim对剪贴板和任何操作系统的支持,它也能正常工作。例如,在Mac上,运行:call system("pbcopy",@")。可以将此命令绑定到密钥。
ilija139

它可以正常工作,但是我可以将它放在我的vimrc中吗?它对我不起作用。
然后akulchawla

4

也许有人会发现它有用。我想保持独立于X剪贴板,并且仍然能够在两个运行的Vim之间复制和粘贴一些文本。这个小代码将所选文本保存在temp.txt文件中以进行复制。将下面的代码放入您的.vimrc中。使用CTRL-c CTRL-v来完成这项工作。

vnoremap:w!cp / dev / null〜/ temp.txt && cat>〜/ temp.txt

noremap:r!cat〜/ temp.txt


4
  1. 放入set clipboard=unnamed您的vimrc
  2. 选择要在Visual模式下复制的内容(按v进入)。
  3. 返回Normal模式(按Escape [esc]),按y复制。
  4. 如果要从操作系统的剪贴板中粘贴某些内容,请在Vim Normal模式下按p / P。

4

我是Vim newby,但是,要在正常模式下将所有文本复制到系统剪贴板(例如,如果要将其粘贴到文字处理器或其他文本编辑器(如gedit,mousepad等),请执行以下操作:

ggVGy

或者,更简单地说:

:%y

按照建议,我还安装了vim-gtk并把

设置剪贴板= unnamedplus

在我的.vimrc中

一切正常

如果只想复制一部分文本,请使用可视模式(v),选择要复制的文本,然后按y

最后,我建议使用剪贴板程序,例如Clipman(我最喜欢的),Clipit,Parcellite或类似工具。

(我在Debian Stretch Xfce中使用vim 8.0)

请原谅我的英语!:-)


4

此答案特定于MAC用户。

MAC可用的默认VIM没有启用剪贴板选项。您需要该选项来访问系统剪贴板。

要检查您的vim是否启用了该选项,请使用以下命令

vim --version

结果,您应具有+clipboard。如果是-clipboard,则您的VIM没有选择访问系统剪贴板的选项。

您需要使用所需的选件制作并安装VIM。以下是命令。

# Create the directories you need
$ sudo mkdir -p /opt/local/bin
# Download, compile, and install the latest Vim
$ cd ~
$ git clone https://github.com/vim/vim.git
$ cd vim
$ ./configure --prefix=/opt/local
$ make
$ sudo make install
# Add the binary to your path, ahead of /usr/bin
$ echo 'PATH=/opt/local/bin:$PATH' >> ~/.bash_profile
# Reload bash_profile so the changes take effect in this window
$ source ~/.bash_profile"

上面将安装+clipboard启用了该选项的最新VIM 。

现在,您需要设置系统剪贴板。将以下行附加到~/.vimrc

set clipboard=unnamed

现在,您可以将文本拖到系统剪贴板。以下步骤说明了如何拉动。

  1. 在vim命令模式下press v,这会将您切换到VISUAL模式。
  2. 左右移动光标以选择需要复制的文本或行。
  3. Press y,这会将选定的文本复制到剪贴板。
  4. 转到任何外部应用程序并CMD + v粘贴。

我将MacBook Pro与macOS Mojave结合使用,并且以上功能均可在其中使用。


3

我遇到了问题,因为我的vim不支持剪贴板

vim --version | grep clip
-clipboard       +insert_expand   +path_extra      +user_commands
+emacs_tags      -mouseshape      +startuptime     -xterm_clipboard

我安装了vim-gnome(支持剪贴板),然后再次检查:

vim --version | grep clipboard
+clipboard       +insert_expand   +path_extra      +user_commands
+emacs_tags      +mouseshape      +startuptime     +xterm_clipboard

现在,我可以分别使用“ + y”和“ + p”进行复制和粘贴了。


3

到目前为止,我一直在MacOsX上使用键盘快捷键对此进行挣扎。我知道问题不在于使用键盘短裤。但这可能会帮助那些同样担心的人。

我发现,如果您取消选中:

查看->允许鼠标报告

从终端菜单中,您将能够使用以下命令复制到剪贴板

command + c

再次。


2

我在.vimrc中写了一条简单的行来使副本正常工作。希望这对某人有帮助。不幸的是,我的vim没有安装剪贴板支持,所以这些建议对我都不起作用。基本上,将此行粘贴到您的.vimrc中:

map <C-c> y:e ~/clipsongzboard<CR>P:w !pbcopy<CR><CR>:bdelete!<CR>

如果您想阅读有关此操作的详细信息,可以在我的博客上阅读此内容。


1
买家当心。在Mac上,这具有怪异的效果。
azatar 2014年

按照指示使用时,这似乎不会将任何内容复制到剪贴板(在Linux ubuntu 16.04上,不支持剪贴板),如果在vim会话中打开了多个文件,则会关闭执行操作的选项卡(可视选择和Cc )。
calocedrus

2

对于某些国际键盘,您可能需要按"+ Space以获得一个"

因此,在这种情况下,您必须按"Space+y"Space*y


2

如果您不想为vim使用任何图形界面,而更喜欢坚持使用终端仿真器,则可能有一种更简单的方法来解决此问题。除了使用yank或类似方法外,首先请查看您使用的终端的文档。我一直在同一个问题上苦苦挣扎(尝试使用+ clipboard和xclip等),最后发现,在我的终端仿真器中,只需按shift并选择要复制的任何文本就足够了。而已。非常简单,无需弄乱配置。(顺便说一下,我使用urxvt)。


1

对于OSX,就像上面的10342答案明确指出的那样,您需要确保vim支持剪贴板功能,并说OSX预装的那个不支持剪贴板,并且如果运行 brew install vim它就可以。

除了运行vi仍会使您运行预装的OSX版本,而不是从brew安装的版本。

为了解决这个问题,我只是将vim命令别名为brew版本,而不是OSX的默认别名:

alias vim="/usr/local/Cellar/vim/8.0.1100_1/bin/vim"

现在我很黄金


1

我的解决方案是将以下行添加到.vimrc中:

map <C-y> :w !xclip -sel c <CR><CR>

该脚本使用Ctrl + y将选定的行(可视模式)或文件内容(如果未选择)复制到剪贴板。如果这很重要,我正在使用Manjaro Linux。


1

我在Mac OS X(10.15.3)上,并且是Vim的新手。我觉得这很令人沮丧,这里的所有答案都太复杂和/或不适用于我的情况。我最终以两种方式使它工作:

  1. 使用pbcopy的密钥映射:适用于mac附带的旧版vim。

    添加vmap '' :w !pbcopy<CR><CR>到您的〜/ .vimrc
    现在,您可以直观地选择并单击''(两个撇号)以复制到剪贴板

  2. 安装较新版本的vim,以便我可以访问其他答案中最推荐的解决方案:

    brew install vim
    alias vim=/usr/local/bin/vim(应将其添加到〜/ .bashrc或等效文件中)
    现在,您可以直观地选择并单击"+yy以复制到剪贴板


非常好的解决方案!
ABD

0

selecting在和的帮助下mouseright-click copy在我的案例中

我不希望包含行号,所以我:set nonumber以前没有copying


您如何在nerdTree中做到这一点
ji-ruh

这与vim无关,仅是基于终端的复制到(X)剪贴板。
卡罗·伍德

我不确定@ ji-ruh
Akash

0

在Windows笔记本电脑上,以上内容对我没有任何帮助。

Ctrl+ C可以复制..但是我需要 Shift+ Insert粘贴!

(始终将笔记本电脑放在Insert无需按辅助键即可随时访问的笔记本电脑上的充分理由)


0

Shift+ Ctrl+,C 如果您处于Linux的图形模式,但是首先需要选择要复制的内容。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.