如何将文本从Vim复制到系统剪贴板?


281

有没有一种方法可以将文本块复制到系统剪贴板,以便可以将其粘贴到另一个程序中?


12
已经在SO上对此进行了询问和回答。 您可能在那里找到更多和不同的信息。
bsmith89

1
我一直在macvim christoomey / vim-system-copy上使用此插件,并且非常喜欢它。它与动作配合很好cpipcpi{
Filype

2
您真正需要的是EasyClip。它会做到的还有更多……
斯科特·韦德

Answers:


320

对于基于X11的系统(即Linux和大多数其他类似UNIX的系统),有两个彼此独立的剪贴板:

  • PRIMARY-这是选定的副本,可以使用鼠标中键粘贴。
  • 剪贴板-使用(通常)复制^C并粘贴^V(类似于MS Windows)。

OS XWindows系统只有一个剪贴板。

对于X11系统,还有许多工具可以为您同步这些剪贴板。因此,如果它们看起来相同,则可能其中之一正在运行。

Vim有两个对应于这些剪贴板的特殊寄存器:

  • *使用PRIMARY; 记忆:小号焦油是小号选(复印-ON- 小号选)
  • +使用CLIPBOARD;助记符:CTRL PLUS C(用于公用键绑定)

在Windows和OS X上,+和之间没有区别*,因为这些系统只有一个剪贴板,并且两个寄存器都引用相同的东西(使用哪个都无所谓)。

您可以将这些寄存器用作任何寄存器。例如,使用主剪贴板*yp命令:

  • "*yy
  • "*p

您可以将其用作更方便的键绑定:

noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

如果要“自动”与系统剪贴板交互,而不是一直手动引用它,则可以设置clipboard变量:

  • 设置unnamed为使用*(PRIMARY,选择)
  • 设置unnamedplus为使用+(CLIPBOARD,^C

现在,只需使用yy将转到系统的剪贴板,而不是Vim的未命名寄存器,p并将粘贴系统的剪贴板。

您还可以像使用以下任何寄存器一样分配这些寄存器let

  • :let @+=42
  • :let @*=42

clipboard设置还有更多选项(例如排除过滤器);但是这些是基础。参见:help 'clipboard'全文;-)

gVim

如果使用gVim,则使用时会出现选择时复制的行为 :set guioptions+=a
默认情况下在X11系统上启用此功能(复制到PRIMARY),而在MS Windows和OSX上则不启用(因为选择任何文本都将覆盖剪贴板)。

不是+clipboard

Vim需要+clipboard功能标记才能使其中任何一个起作用。你可以检查你的Vim有这种通过:echo has('clipboard')从Vim(如果输出是0,它存在,如果是1,它是),或检查的输出 vim --version进行+clipboard

大多数Linux发行版默认都带有“最小”的Vim构建,它没有+clipboard,但是您通常可以安装它:

  • Debian和Ubuntu:安装vim-gtkvim-gnome
  • Fedora:安装vim-X11并运行,vimx而不是vim更多信息)。
  • Arch Linux:安装gvim(这也将+clipboard正常启用vim)。

您也可以使用xclipxcopyxsel将文本复制到剪贴板。请参阅以下问题以获取解决方案:

SSH协议

如果启用通过SSH的X11转发,还可以在远程计算机上使用剪贴板。这对上面的技巧特别有用,因为您可以随后使用它 xclip来访问桌面的剪贴板。您要交换的计算机上的Vim仍将需要该+clipboard功能。

这需要进行ForwardX11Trusted设置,并且仅应在受信任的服务器上完成,因为这使服务器可以对X11会话进行几乎完全的控制:

$ ssh -XY myhost

要使这些设置持久化(因此您不必-XY每次都添加),可以在您的代码中执行以下操作~/.ssh/config

# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
    ForwardX11 yes
    ForwardX11Trusted yes

新病毒

Neovim改进了剪贴板支持。内置的界面中除去,并用该调用外部工具,如系统所取代xclipxselpbcopy/ pbpaste

它应该自动选择并使用这些实用程序。在OS X上pbcopypbpaste默认情况下应该可用,在Linux上,您可能想安装它xclip,因为它是使用最广泛的(实际上有两个 版本xsel带有不兼容的标志。这确实很愚蠢)。

另请参阅:help clipboardNeovim。


6
ssh -Y表示-X,因此-X可以省略。
hildred

对于某些国际键盘,您可能需要按"<Space>以获得一个"。因此,在这种情况下,您将必须按"<Space>+y"<Space>*y进行复制。
亚瑟F

1
对我来说(几年前),这是一个非常有趣的副作用,它实现了"可以选择许多命名寄存器的实现。"+不是魔术,只是注册+。因此,举例来说,如果你想在同一时间复制三件事情,并通过一个,你可以一个他们每个人的粘贴"1y"2y以及"3y后来"1p"2p"3p。在几乎所有其他编辑器中,它确实功能强大且不存在。另一个有趣的用法是查看存储的宏。例如,如果使用进行录制qq,但您意识到需要修复它,则可以:在临时行"qp中修复它,然后进行修改"qd
Shahbaz

1
请注意:OS X有两个单独的剪贴板。一种使用Cmd-C和Cmd-V进行访问,另一种使用emacs快捷键Ctrl-K和Ctrl-Y进行访问。
BallpointBen

3
@shahbaz-最好使用字母寄存器来实现此目的,因为每当删除文本时,编号的寄存器都会被更改。
evilsoup

18

其他答案包括如何将文本从缓冲区复制到系统剪贴板。另一个常见的操作是将文本从另一个寄存器复制到剪贴板。例如,如果您已经将一些文本提取到"(默认寄存器)中,则可能需要将该寄存器加载到剪贴板中。

您可以使用:let

  • let @+=@" —将默认寄存器复制到剪贴板
  • let @*=@" —将默认寄存器复制到X11主要选择中(“鼠标剪贴板”)
  • let @+=@a—从寄存器复制a到剪贴板
  • 等等

请注意,这通常适用于寄存器:将寄存器let @a=@b复制b到register a


17

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

set clipboard=unnamedplus

这会将默认的Vim寄存器更改+为链接到系统剪贴板的寄存器。来自:h clipboard-unnamedplus

                                        clipboard-unnamedplus
unnamedplus     A variant of the "unnamed" flag which uses the
                clipboard register '+' (quoteplus) instead of
                register '*' for all yank, delete, change and put
                operations which would normally go to the unnamed
                register.  When "unnamed" is also included to the
                option, yank operations (but not delete, change or
                put) will additionally copy the text into register
                '*'.
                Only available with the +X11 feature.
                Availability can be checked with: 
                        if has('unnamedplus')

为什么在vim实例之间(每个都在单独的终结器终端中)拉动和粘贴,这对我不起作用?
Thinwybk

如果您使用的是Linux,并且Vim已使用+ X11功能进行了编译,并且已设置剪贴板= unnamedplus,则应该可以在一个vim实例中拉一行,然后将其粘贴到另一个vim实例中。您还应该能够使用CTRL + V或SHIFT + INSERT将其粘贴到任何其他应用程序中。您可以:version在Vim 中使用来查看+ X11是否出现在包含的功能列表中。您还可以通过以下方法检查“ unnamedplus”功能是否可用: :if has('unnamedplus')⏎ echo 'yes'⏎ endif 如果您不在Linux上,则应使用unnamedplus代替unnamedplus。
昆西·鲍尔斯

10

在支持它的版本中,名为寄存器的*是系统剪贴板。要将文本从Vim复制到系统剪贴板,可以使用可视模式选择文本,然后按"*y将其复制到系统剪贴板。

相反,用于"*p将文本从系统剪贴板粘贴到Vim中。


5

我建议您使用Gvim,并将其添加到您的.vimrc

source $VIMRUNTIME/mswin.vim
behave mswin

这使得支持CtrlCCtrlXCtrlV就像在Windows记事本。

请注意,这还会添加其他一些常见的Windows快捷方式,例如CtrlSfor :wCtrlAfor select all等。



0

其他所有答案都涵盖了有关寄存器的所有重要内容。我想再添加一件事。

Vim中有一种方法可以将可视选择的文本直接复制到剪贴板中。只需将其放在您的vimrc文件中:

set guioptions+=a

并且,每当您在视觉上选择一些文本时,它将被复制到剪贴板。有关此的更多信息,:help guioptions

顺便说一句,这仅适用于gVim。


2
guioptions+=a在Carpetsmoker的答案中也提到过。
muru

@muru是的,对不起。我以前没看过 我刚刚看到了
杜尔加·斯瓦鲁普

0

您也可以使用全局命令在剪贴板上放置一些特定的图案。在您将信息分散在文件中并且手动处理容易出错和累人的情况下,此功能很有用。

首先清理将接收信息的寄存器

:let @a=""

然后将包含该模式的所有行复制到该行

:g/pattern/yank A

最后将信息转移(复制)到系统剪贴板

:let @+=@a

如果您尝试将包含“模式”的每一行直接复制到剪贴板,则将无法正常工作,因为剪贴板不具有附加新内容的功能,因此我们在此处使用普通的vim寄存器来存储包含该行的所有行。立即将其放入剪贴板中。

OBS:必须先使用寄存器,然后再使用它,并且使用UPPERCASE版本的寄存器允许我们附加内容,否则它也将不起作用。


0

如果您+clipboard由于某种原因无法弄清楚如何上班,则可以执行此操作。

假设您只想复制文件的一部分,那么我进入shift+ v进入可视模式,并且只突出显示要复制的行。那我做

# Linux Wayland
:'<,'>w !wl-copy

# Linux Xorg
:'<,'>w !xclip -selection clipboard

说明

  • '<,'> -表示您使用视觉模式选择了一个范围(您无需输入)
  • w !{cmd}-将范围写入标准输入cmd,请参阅:help w_c
  • wl-copy并且xclip,你可以管的文本,他们就会把它添加到您的系统剪贴板程序

同样,一旦这成为您的历史记录,您就不必再次输入整个内容。只需在可视模式下进行选择,w然后键入然后按向上即可执行命令。另外,您也不必使用可视模式。您可以设置任意范围。

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.