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

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

我可以让vim粘贴到系统的剪贴板吗?

880309 次浏览

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

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

如果所有这些都超出了您的想象,请尝试使用"*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

Linux

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

细节似乎有些配置和系统依赖,所以你的里程肯定会有所不同。不过,它肯定会让你指向正确的方向。

另见

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

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

Ctrl+Shift+v

事先记住

 :set paste

以避免弄乱缩进。

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

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

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

" copy and pastevmap <C-c> "+yivmap <C-x> "+cvmap <C-v> c<ESC>"+pimap <C-v> <ESC>"+pa

剪贴板

有一个特殊的寄存器来存储这个选择,它是"*注册。这里什么都不放,除非关于什么文本的信息是选择即将改变(例如,用鼠标左键单击某处),或当另一个应用程序想要粘贴选定的文本。然后将文本放入在"*寄存器中。例如,剪切一条线并使其成为当前选择/放在剪贴板上:

    "*dd

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

    "*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: Copy2. 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

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

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

  1. 安装parcellite(具有低内存占用的剪贴板管理器);

  2. .vimrc文件中,添加以下内容:

    command Clip r !parcellite -c
  3. 重新启动vim。

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

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

添加到您的~/. vimrc:

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

接下来是Conner的回答,很棒,但是插入模式下的C-R C-p +C-R C-p *有点不方便。命令模式下的"*p"+p也是如此。

一位VIM大师建议将C-v映射到C-r C-p +的作用。

您可以仅将:inoremap <C-v> <C-o>"+p用于插入模式

如果你真的想覆盖块视觉模式(不推荐他作为视觉模式是好的)你可以有map <C-v> "+p

我尝试了上面的建议,没有一个在我的环境中工作。(Windows PuTTY clone over ssh)

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

其中一条评论建议使用SHIFT+INSERT,它完成了将桌面剪贴板粘贴到Vim缓冲区的技巧。Ctrl-C已经在努力从Vim复制到桌面剪贴板。

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

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

:set clipboard = unnamed

这解决了我的问题。

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

换句话说,OSX将其视为常规窗口,而这正是备受指责的Apple“命令”按钮派上用场的地方。

b-30

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

对于一些国际键盘,您可能需要按+空间才能获得"

因此,在这种情况下,您必须按空间+y空间*y才能复制。

空间+p空间*p粘贴。

这对我有用:Ctrl+Shift+V

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

" Copy and pasteif has('clipboard') && !has('gui_running')vnoremap <C-c> "+yvnoremap <C-x> "+dvnoremap <C-v> "+pinoremap <C-v> <C-r><C-o>+endif

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

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

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

如果您在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

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

如果你想改变你的vimrc等,其他解决方案很好……但是我想要一个简单的方法来复制from vim我的系统键盘。这就是我想出来的。

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

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

最简单的解决方案,也适用于不同的Linux机器之间通过ssh是:

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

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

set clipboard=unnamedplusset paste
  1. 如果您通过ssh登录到其他机器上,请使用选项-Y:ssh -Y machine

现在,复制和粘贴应该在一台机器上完全按照预期工作,并且在不同的机器上只使用y进行yank,p进行粘贴。注意在您想要使用此功能的所有机器上修改.vimrc

如果您使用鼠标,请先

 :set paste

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

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

进入粘贴模式

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

离开粘贴模式

  • ESC
  • 设置非粘贴

你粘贴了文本,你可以再次键入。

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

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

退出并重新启动vim。

在Linux或Mac上使用Vim 8+,您现在可以简单地使用操作系统的本机粘贴(Linux上为ctrl+shift+V,Mac上为cmd+V)。

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

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

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

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

vimhomebrew包似乎使用clipboard选项编译,所以我的修复是:

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

复制到OS剪贴板

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

从操作系统剪贴板粘贴

"*p

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

brew install vim

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

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

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

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

它扰乱了粘贴功能。

进入vim窗口后,按进入插入模式。然后将光标移动到所需位置,同时按Ctrl+插入按钮从剪贴板粘贴。

什么简单地为我在Linux工作(Ubuntu 20.04)

  • 复制到系统剪贴板:

    1. 选择要在可视化模式下复制的内容。
    2. 类型"+y
    3. 输入
  • 从系统的剪贴板粘贴一些东西:

    1. 移动到要在vim中粘贴复制文本的位置。
    2. 输入
      • "+P在光标或之前粘贴
      • "+p在光标后粘贴。

要了解更多这是如何工作的复制和粘贴到/从Vim从/到其他程序!

这些组合键适用于任何操作系统。

使用鼠标选择目标文本,然后引用要复制、剪切和粘贴的键序列。

  • 复制:Ctrl+插入
  • 粘贴:Shift+插入
  • 剪切:Shift+德尔
  • 粘贴:Shift+插入

Shift+右键->粘贴

帮了我大忙

Mac OS X:

  1. 运行vim --version | grep clipboard检查剪贴板是否启用(使用+)
  2. set clipboard=unnamed添加到. vimrc
  3. 重启终端&vim