如何使Vim从系统剪贴板粘贴(并复制到系统)?


769

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

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



7
复制“ + y Paste” + p就像yank并粘贴一样,只不过您之前指定了注册表。
Banjocat

2
要使用以下命令,请确保已完成 sudo apt-get install vim-gnome将其添加到使用系统剪贴板的内置vim中的功能。
Harnirvair Singh

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

3
默认情况下,在Fedora上- 没有剪贴板访问权限(您需要gvim),superuser.com
questions / 194747 /…

Answers:


880

"*"+寄存器是系统的剪贴板(:help registers)。根据您的系统,他们可能会做不同的事情。例如,在不使用X11的系统(例如OSX或Windows)上,该"*寄存器用于读取和写入系统剪贴板。在X11系统上,两个寄存器都可以使用。请参阅参考资料:help x11-selection,但是基本上"*与X11的PRIMARY选择类似(通常使用鼠标复制您选择的内容并用鼠标中键粘贴),"+并且与X11的CLIPBOARD选择类似(适合剪贴板)。

如果这一切都困扰您,请尝试使用"*yy"+yy将线复制到系统剪贴板。假定您具有适当的编译选项,则一个或另一个应起作用。您可能希望将其重新映射为更方便的方式。例如,您可以放入vnoremap <C-c> "*y〜/ .vimrc,以便可以直观地选择并按Ctrl+ c拉到系统剪贴板。

请注意,复制/从系统剪贴板粘贴将无法正常工作,如果:echo has('clipboard')返回0。在这种情况下,Vim不是与编译+clipboard功能,你将不得不安装一个不同的版本,无需重新编译。某些linux发行版默认提供最小的vim安装,但是通常,如果您安装vim-gtkvim-gtk3软件包,则可以获得更多功能。

您可能还想看看中所述的'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以获取更多详细信息。


103
这是非常有用的信息,但是您可以总结一下从系统剪贴板粘贴时需要进行的击键操作"*p吗……例如,一个在做什么?是否按Shift-',然后按Shift-8,再按p,依此类推?
T. Brian Jones

10
是的,依次键入这三个字符。vim中的许多命令都使用所谓的“操作员挂起模式”,其中按下一个键,然后vim等待更多键。以dd为例。第一个d进入操作员挂起模式,然后第二个d完成命令并删除该行。dG但是,如果键入,G它将使其删除到文件末尾,而不是仅删除该行。寄存器使用相同的主体,以允许各种命令使用它们。
Conner 2013年

4
唉! 如果我今天之前只看过这篇文章!这就是我一直想了解的有关从系统剪贴板进行复制和粘贴的所有信息。“ <Cr> <Cp> *或<Cr> <Cp> +”是纯金。
基思·品森

54
重点:您需要安装vim-gtk软件包(至少在Debian下),以获取使用编译的vim +xterm_clipboard。花了我4000万来找出答案,仅几秒钟即可找到sudo apt-get install vim-gtk
Dominykas Mostauskis 2014年

3
@DominykasMostauskis vim-gnome也可以使用并+xterm_clipboard启用。
CHEV

155

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

Ctrl+ Shift+ v

事先记住

 :set paste 

避免弄乱压痕。


19
如果有多行像python这样的循环
会使

11
对插入模式使用粘贴切换。例如,设置pastetoggle = <F2>,然后在插入模式下,按<F2>,然后插入您的python代码。
Jan Weitz 2014年

是的,使用Ctrl + Shift + c复制并粘贴到其他文件中
neel

1
如果制表符/空白,eol等显示为可见字符(通过listchars选项),则将复制那些替代字符,而不是隐藏的字符。
user907860 '16

2
考虑到其简洁的答案,这应该是选定的答案
艾丁(Aidin)

41

的Linux

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

具体细节似乎在某种程度上取决于配置和系统,因此您的工作量肯定会有所不同。不过,它绝对应该使您指向正确的方向。

也可以看看

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


1
*映射到X11主寄存器(通常由鼠标粘贴)。+映射到通常由快捷方式粘贴的X11剪贴板寄存器。
ZyX

@ZyX不在我的系统上,但是您的行驶里程肯定会有所不同。如果要跨平台和软件版本获得一致的体验,最好明确配置所需的行为。
托德·雅各布斯

我相信这意味着您拥有klipper / glipper之类的剪贴板管理器,它们能够同步两个缓冲区。它不会改变的事实,VIM用途*为小学和+剪贴板X11寄存器,可以在VIM源看到这一点:这些值都设置有从不修改,clip_starclip_plus始终用于*+分别寄存器。
ZyX

41

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

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

粘贴到什么里面?
StarWind0'8

该恕我直言是将clibboard设置为未命名的更好的解决方案-不会在每次执行x / dd / y等操作时弄乱OS剪贴板。在Mac上,最好将C(ctrl)修饰符更改为D,以映射cmd + c / x / v组合。
mindex

34

这将是您在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
我喜欢你的解决方案。我想要一个更好的解释。
2014年

优秀的。使用寄存器总是让我犹豫,不得不思考。这要好得多
JonnyRaa

我的vim版本带有+ clipboard,这个选项对我不起作用。我正在使用Byobu(在后台使用Tmux)。
GGhe

我必须为Fedora添加设置剪贴板+ = unnamedplus
hakunin

29

我认为这个问题值得一个更客观和图形化的答案:

进入粘贴模式

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


离开粘贴模式

  • ESC
  • :设置nopaste
  • i

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


1
我可以使用它,但是:set nopaste什么也没做。应该怎么办?我为什么需要它?
MarkoAvlijaš18年

1
好吧,实际上,确实如此。当您执行时:set nopaste,您是在告诉编辑器您不想再粘贴。按下后i,您将返回到编辑模式:)。
ivanleoncz

2
老实说,Marko,我不知道。
ivanleoncz '18

1
SHIFT + Insert为我做到了,谢谢!
Melissa Loos

1
这对我来说就像一种魅力。每次回到vim时,我总是总是不得不看起来像这样。
benjaminadk

17

剪贴板

有一个用于存储此选择的特殊寄存器,即“ *寄存器”。除非要更改有关选定文本的信息(例如,在某处用鼠标左键单击)或要更改其他应用程序的信息,否则不放置任何内容。粘贴选定的文本。然后将文本放入“ *”寄存器。例如,要剪切一条线并使其成为当前选择/将其放置在CLIPBOARD上:

    "*dd

类似地,当您想从另一个应用程序中粘贴选择内容时,例如,通过单击鼠标中键,该选择内容将首先放入“ *寄存器”,然后像放置其他任何寄存器一样“放入”。例如,将选择内容放入(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-clipboard支持,键入:

% vim --version

如果看到“ + xterm_clipboard”,那就很好了。

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

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

小学,中学和剪贴板

传统上,PRIMARY选项用于通过鼠标中键实现复制和粘贴。应用程序不经常使用SECONDARY和CLIPBOARD选项。

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


12

我尝试了以上建议,但这些建议在我的环境中均无效。(通过ssh的Windows PuTTY克隆)

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

建议使用SHIFT+INSERT其中一条注释来完成从桌面剪贴板粘贴到Vim缓冲区的技巧。Ctrl-C已经在从Vim复制到桌面剪贴板上了。


2
我正在使用cmder工具[Windows 8.1]中的vim。当您进入cmder设置>键和宏>粘贴时,对于多行粘贴我有shift + insert命令,对于单行粘贴有ctrl + v。
Zubair Alam 2014年

1
对我来说,简单的右键单击就像一个魅力!只需单击鼠标右键!
Fr0zenFyr 2014年

2
因为您使用的是终端,所以ssh vim无法通过SSL到达本机系统的剪贴板。SHIFT+INSERT之所以有效,是因为它是终端(或您的PuTTY)的粘贴选项;但是,缩进可能是错误的。请查看我的答案的最后一段,关于该paste选项的更正。
2015年

1
@jinksPadlock。谢谢..是的..我可以通过鼠标复制/粘贴..试图找出如何通过“仅键盘”进行操作。从Windows复制到VIM可能仅通过键盘使用Putty进行,但不能反向进行。在Windows的bash中..在任一方向的ATM上都无法这样做。编制了一份资源清单,为人们指明了正确的方向,也为我们指明了方向。.如果您有任何要补充的地方..也许您可以在这里添加他们:stackoverflow.com/questions/45271895/…–
alpha_989

1
@ alpha_989以后要比从来没有更好;)我无法添加到jinksPadlock',因为我目前没有Windows OS。SHIFT+INS从Linux主机运行到ssh vim,以及鼠标第三次单击也是如此。
tuk0z

10

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

添加到您的〜/ .vimrc:

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


1
感谢这个好主意!我最终使用:vnoremap <C-C> :w !xclip -i -sel c<CR><CR>
andy

6

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

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

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

command Clip r !parcellite -c

3)重新启动vim。

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


4

这对我有用:Ctrl+ Shift+V


3
@neel的答案已经说明了这一点。如果您想说它也对您有用,那应该只是评论,或者更好的是投票。
ericbn

3

在不同的Linux机器之间也可以使用的最简单的解决方案ssh是:

  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用于拉动和p粘贴,复制和粘贴就可以完全在单个计算机上以及跨不同机器上按预期工作。注意:.vimrc在要使用此功能的所有计算机上进行修改。


我认为,X服务器也应该在服务器中可用才能正常工作。是的 它可能由vim-gtk安装。我认为,xvfb将是运行X服务器的替代选项。
Ajeeb.KP

3

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

正如其他答案所建议的那样,我运行vim --version并注意到它返回-clipboard,这表示vim我的计算机随附尚未使用剪贴板选项进行编译。

homebrew软件包vim似乎可以使用该clipboard选项进行编译,因此对我来说,解决方法是:

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


2

从康纳的答案,这是伟大的,但继C-R C-p +C-R C-p *插入模式是有点不方便。同上"*p"+p来自命令模式。

VIM专家建议以下内容以映射C-vC-r C-p +功能。

您只能具有 :inoremap <C-v> <C-o>"+p插入模式

如果您真的想重写逐块可视模式(不推荐他,因为可视模式很好),您可以 map <C-v> "+p


2

如果您在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并将其粘贴到系统范围内。



1

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


1

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

换句话说,OSX像对待常规窗口一样对待它,而这正是苹果公司的“命令”按钮非常有用的地方。

B-30


1
对于任何其他OS上的任何体面的终端仿真器也是如此。苹果在这里毫无优势。
underscore_d

1

基于@ 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

作为替代方案,可以使用在“使劲”的启发键,“删除”和“放” Vim的动词:<C-y><C-d><C-p>分别。这些将仅覆盖一个默认映射:

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

1

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

  • 选择要在视觉模式下复制的文本 v
  • :(它将自动展开以显示:'<,'>
  • 键入y * y +(取决于您的系统)将选定的文本拖到系统剪贴板


1

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

echo "set mouse-=a" >> ~/.vimrc

退出并重新启动vim。


1

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

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

您甚至不再需要安装+clipboardor +xterm_clipboard功能。此功能称为“包围式粘贴”。有关更多详细信息,请参见将文本粘贴到vim中时关闭自动缩进。


0

当我使用未与Gnome集成的Debian vim时(vim --version | grep clip#显示不支持剪贴板),我可以在按住Shift键并用鼠标选择文本后将其复制到剪贴板,就像使用任何其他工具一样。其他诅咒程序。从@Conner的评论中可以看出,是终端(在我的情况下为gnome-terminal)在感觉到我的Shift按下时关闭了鼠标事件报告。我猜基于curses的程序在向终端发送特定的转义序列后可以接收鼠标事件。


1
这是使用您的终端,而不是vim。
Conner 2015年


0

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


0

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

因此,在这种情况下,您必须按"Space+y"Space*y进行复制。

"Space+p" Space*p粘贴。


0

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

brew install vim

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

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

因此,我很高兴找到使用剪贴板注册器的新方法。

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.