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

评论

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

我一直在macvim christoomey / vim-system-copy上使用此插件,并且非常喜欢它。它与运动cpip,cpi {。
一起使用时效果很好
您真正需要的是EasyClip。它会做到的,还有更多...

我无法添加答案,只能添加评论。如果只想复制文本,则也可以使用sed :)。 sed -n 5p文件;只有第5行。 sed -n -e 5p -e 8p文件;仅第5和第6行。 sed -n 5,8p文件; 5号和8号之间的线。它将在控制台中打印行。您可以通过选择文本轻松进行复制。

#1 楼

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

PRIMARY-选择复制,并可以使用鼠标中键
粘贴。
剪贴板-通常复制到^C,然后粘贴到^V(类似于MS Windows)。

OS X和Windows系统只有一个剪贴板。
对于X11系统,还有许多工具可以为您同步这些剪贴板。因此,如果它们看起来相同,则可能其中之一正在运行。
Vim有两个与这些剪贴板对应的特殊寄存器:


助记符:“星​​号已选定”(用于选择时复制)

*使用CLIPBOARD;助记符:CTRL PLUS C(用于公用键绑定)

在Windows和OS X上,++之间没有区别,因为这些系统只有一个剪贴板,并且两个寄存器都引用对同一件事(使用哪个都无所谓)。
您可以将这些寄存器用作任何寄存器。例如,使用带有**命令的PRIMARY
剪贴板y

p
"*yy

您可以将其用作更方便的按键绑定:
noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

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

将其设置为clipboard以使用unnamed(选择时为PREMARY)
将其设置为*以使用unnamedplus(剪贴板,+
而不是Vim的未命名
寄存器,而^C将粘贴系统剪贴板。

yy设置还有更多选项(例如,排除过滤器)。但是
这些是基础。有关完整信息,请参见p ;-)
gVim
如果使用gVim,则在使用
let时可以获得选择时复制的行为。
默认启用X11系统(复制到PRIMARY),但不在MS
Windows&OSX上(因为选择任何文本都会覆盖剪贴板)。
:let @+=42吗?
Vim要求:let @*=42的任何功能标记这工作;您可以通过在Vim中使用clipboard来检查Vim是否具有此功能(如果
输出是:help 'clipboard',则不存在,如果它是:set guioptions+=a),或检查
的输出+clipboard代表+clipboard
默认情况下,大多数Linux发行版都带有“最小” Vim构建,
没有:echo has('clipboard'),但是您通常可以安装它: Ubuntu:安装0
Fedora:安装1并运行vim --version而不是+clipboard(更多信息)。
Arch Linux:安装+clipboard(这也将使vim-gtk3用于正常的vim-X11)。

还可以使用vimxvimgvim将文本复制到剪贴板;
请参见以下问题以获取解决方案:

为*和+寄存器定义自定义命令
如何在不使用+ clipboard的情况下通过ssh会话进行复制?这对于上面的技巧特别有用,因为您可以使用
+clipboard访问桌面剪贴板。您要
运行的计算机上的Vim仍然需要vim功能。
这需要xclip设置,并且应该仅与受信任的服务器一起完成,因为这样可以服务器几乎可以完全控制X11会话:
$ ssh -XY myhost

要使这些设置持久化(这样就不必每次都添加xcopy),
您可以在xsel中执行以下操作:
# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
    ForwardX11 yes
    ForwardX11Trusted yes

Neovim
Neovim改进了剪贴板支持。删除了内置接口,并
将其替换为调用外部实用程序(例如xclip+clipboard
ForwardX11Trusted / -XY)的系统。
它将自动选择这些实用程序并使用它们。在OS X上,默认情况下应该提供~/.ssh/config
xclip,在Linux上,您可能想
安装xsel,因为这是最广泛使用的(实际上有两个版本的pbcopy具有不兼容的标志。这真是愚蠢)。
也请参阅Neovim中的pbpaste

评论


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

–被隐藏
15年3月16日在20:52

(几年前)对我而言,学习此知识的一个非常有趣的副作用是认识到“可以选择许多命名的寄存器。” +并不是魔术,它只是寄存器+。因此,例如,如果您想同时复制三件事并逐一粘贴,则可以“ 1y”,“ 2y”和“ 3y”以及后来的“ 1p”,“ 2p和” 3p。在几乎所有其他编辑器中,它确实功能强大且不存在。另一个有趣的用法是查看存储的宏。例如,如果您使用qq录制,但是您意识到需要修复它,则可以:在临时行中“ qp,修复它和” qd。

– Shahbaz
17年2月3日在18:06

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

– BallpointBen
17年2月5日在17:16

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

– evilsoup
17年2月26日在10:17

问题中所述的复制和粘贴适用于台式机。的确,与vim一起安装gvim软件包可以为您提供剪贴板功能。但是在文件浏览器中,然后会为您提供两个文本编辑器来打开文件!这看起来很丑。这就是为什么最好只安装软件包vim和vim-gui-common的原因。后来的版本提供了剪贴板功能,而无需安装gvim。这是在Linux Debian 10上。

– 71GA
20年1月2日,21:34



#2 楼

来自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
18年11月30日在9:43

如果您使用的是Linux,并且Vim已使用+ X11功能进行了编译,并且已设置剪贴板= unnamedplus,那么您应该能够在一个vim实例中拉出一行并将其粘贴到另一个vim实例中。您还应该能够使用CTRL + V或SHIFT + INSERT将其粘贴到任何其他应用程序中。您可以在Vim中使用:version来查看+ X11是否出现在包含的功能列表中。您也可以通过:if has('unnamedplus')⏎echo'yes'⏎endif检查是否可以使用'unnamedplus'功能。

–昆西凉亭
18-11-30在15:49



#3 楼

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

可以使用:let进行此操作:




—将默认寄存器复制到剪贴板中

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

let @*=@" —从寄存器let @+=@a复制到剪贴板


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

#4 楼

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

相反,使用“ * p从将系统剪贴板插入Vim。

#5 楼

我建议您使用Gvim,然后将其添加到您的.vimrc中: />请注意,这还会添加其他一些常见的Windows快捷方式,例如CtrlS用于:w,CtrlA用于全选,等等。

#6 楼

如果您由于某种原因无法弄清+clipboard的工作方式,那么可以这样做。

假设您只想复制文件的一部分,我执行shift + v进入可视模式,仅突出显示我要复制的行。然后,我要执行此操作。 (您无需输入)

'<,'>-将范围写入w !{cmd}的标准输入,请参见cmd的更多内容


:help w_cwl-copy是您所需要的程序可以将文本传递到管道,他们会将其添加到系统剪贴板中。

此外,一旦这已成为您的历史记录,您就无需再次输入整个内容。只需在可视模式下选择,键入xclip,然后按向上键,命令应自动完成。另外,您也不必使用视觉模式。您可以设置任意范围。

评论


对此(在另一个类似的答案上)表示赞成,因为这一点给出了解释。顺便说一句,给我自己或其他读者的注释:使用xclip时,您不必添加-selection剪贴板参数,该参数太长而无法键入。默认的:'<,'> w!xclip会将内容复制到“主要”(即“选择时复制”剪贴板)中,可以使用鼠标中键粘贴。

– RayLuo
20年5月8日在17:18

#7 楼

我在vim的系统剪贴板和tmux上苦苦挣扎。

使用xselxclip可以解决此问题,例如在本示例中:在正常模式下:V<motionkey>

2.a),带有xsel的运行例::'<,'>w !xsel -b

2.b)带有xclip的运行例::'<,'>w !xclip -selection clipboard

3 。)粘贴到另一个程序中

...,现在将其作为首选。

这些选项(-b或-selection剪贴板)基本上意味着该程序(xsel或xclip)发送到后台,并等待另一个程序粘贴内容,以便它可以“干扰”。

(在具有i3,xfce4-终端,tmux的manjaro上)

#8 楼

这是我在系统剪贴板中想要的行为:


用换行符对行进行换行
不用换行符对行进行换行
对视觉上的行进行换行所选作品
剪切作品
用换行作品剪线
不换行作品剪线

按作品我的意思是:我仍然可以使用p在vim中粘贴时,我也可以使用系统剪贴板。基本上,我希望复制和粘贴能够按预期工作,并且我不想使系统剪贴板变得多余。通过将这些行添加到我的~/.vimrc中来创建系统剪贴板:

" use system clipboard
" https://anuragpeshne.github.io/essays/vim/7.html
noremap y "*y
noremap yy "*yy
noremap Y "*y$
noremap x "*x
noremap dd "*dd
noremap D "*D


来自https://anuragpeshne.github.io/essays/vim/7.html博客的主要见解帖子是:


递归映射是邪恶的,始终使用非递归映射。 (noremap)


评论


“做什么?”第一个答案已经解释了*的含义(指的是主剪贴板),但是我什么地方都看不到任何解释“”的含义以及为什么该命令起作用。

–乔什·戴斯蒙德(Josh Desmond)
20-05-29在16:23

这不是立即显而易见的,因为您可能已经习惯于使用引号来绕过诸如“ foo”之类的单词;但是,对于vim,“ *实际上是连接到系统剪贴板的”寄存器”(vim概念)的名称。如果打开vim并键入:registers,则可以看到其他寄存器的名称,例如:“”,“ 0 ,“ 1,等等。我发现本文对于了解寄存器非常有用:brianstorti.com/vim-registers

–mbigras
20-05-29在18:25

#9 楼

如果您的vim不支持+clipboard,则可以使用适用于Linux,Mac,Windows,tmux,屏幕,...的fakeclip插件...

#10 楼

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

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

BTW,这仅适用于gVim。

评论


Carpetsmoker的答案中也提到了guioptions + = a。

–muru
16-2-26在7:32

@muru是的,对不起。我以前没看过我刚刚看到了

–杜尔加·斯瓦鲁普(Durga Swaroop)
16-2-26在8:26

#11 楼

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

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

:let @a=""


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

:g/pattern/yank A


如果您尝试将包含“模式”的每一行直接复制到剪贴板,将无法正常工作,因为剪贴板没有附加新内容的能力,因此我们在这里使用普通的vim寄存器一次存储包含模式的所有行,然后将其放在剪贴板上。

OBS:有必要在使用寄存器之前先对它进行对齐,并且使用UPPERCASE版本的寄存器可以使我们追加内容,否则它也不起作用。

#12 楼


用于剪切/复制/粘贴的MacVim Cmd + x/c/v

如果使用MacVim,则通常在$ VIMRUNTIME / macmap.vim中定义常规的Cmd+x/c/v,该源代码默认情况下是源的,因此无需配置即可使用: br />
vnoremap <special> <D-x> "+x

vnoremap <special> <D-c> "+y

cnoremap <special> <D-c> <C-Y>

nnoremap <special> <D-v> "+gP
cnoremap <special> <D-v> <C-R>+
execute 'vnoremap <script> <special> <D-v>' paste#paste_cmd['v']
execute 'inoremap <script> <special> <D-v>' paste#paste_cmd['i']


但是,使用它们会导致不知道vim方式并迷失在外国计算机/环境中的vim用户。