如何将选定内容复制到OS X剪贴板

236

我在Vim中选择了一个区域。如何将其复制到OS X剪贴板中?

(通过管道写入/usr/bin/pbcopy可以将内容写入OS X剪贴板)


7
只需进行可视化选择,然后执行"+y命令。 - zx1986
2
OSX自带的vim版本不支持+clipboard或者+xterm-clipboard。你可以通过运行vim --version | grep clipboard来验证这一点。你可以通过brew install vim --with-client-server来解决这个问题。 - LondonRob
1
或者使用MacVim,它提供了一个命令行版本,可以通过符号链接放置在你的~/bin下,然后将~/bin插入到你的路径中,优先于系统安装的vim和其同义词。 - the Tin Man
在@zx1986所写的基础上,我做了三件事: 1)将以下内容添加到我的/.bashrc中,以便将vi/vim别名为MacVim的终端模式: alias vi='mvim -v' 2)将以下内容添加到/.vimrc中,映射Ctrl+c(而不是Cmd+c): vnoremap <C-c> "+y 3)配置Keyboard Maestro在终端中运行时键入键序列^c(Ctrl+C)(在我的情况下是iTerm2)这使得可以使用Cmd+c将文本复制到OSX剪贴板中,以便在其他OSX应用程序中粘贴。 - Neil Griffin
28个回答

264

对于 MacVim 和 Windows Gvim,只需将以下内容添加到您的 ~/.vimrc 文件中:

set clipboard=unnamed

现在所有操作例如yyDP都可以使用剪贴板,不需要在它们前面加上"*"+


2
我花了整个上午的时间来弄清楚如何将MacVim启用的⌘-C和⌘-V命令与y、d和P命令分开,最终找到了解决方法。果然,当我还是一个vim新手时,我就已经将这个添加到了我的vimrc中,自那以后一直让我感到沮丧。 - Jonathan Dumaine
2
对于初次使用 MacVim 的用户,可以通过在终端中使用 -v 标志(mvim -v)来使用它。我将其别名设置为 vim 和 mvim。 - pk-nb
3
正如上面@VincentG在评论中提到的那样,这对基于终端的Vim版本确实有效,但是那些在终端内使用tmux的人需要遵循这里详细介绍的解决方案之一:https://dev59.com/zmgu5IYBdhLWcg3wU1mN#11421329 - user456584
3
只要 :echo has("clipboard") 返回值为 1,也就是 MacVim 的情况,并且我有一个运行 mvim -vvi 别名,那么这个答案应该被接受。 - jdsumsion
1
@Joseph,如果 :version 显示 -clipboard,那么 Vim 的版本不支持剪贴板功能。我在谈论 MacVim,它是一个 GUI 应用程序。 - George V. Reilly
显示剩余4条评论

139
如果启用了剪贴板,则可以通过键入"*y将选定区域复制到剪贴板。
要查看是否已启用,请运行vim --version并查找+clipboard-clipboard。例如,默认情况下,在我的10.5.6框上未启用:
%which vim
/usr/bin/vim
%vim --version
VIM-Vi IMproved 7.2(2008年8月9日,编译于2008年11月11日17:20:43)
包括补丁:1-22
由_www@b77.apple.com编译
没有GUI的普通版本。包含的功能(+)或不包含的功能(-): ... -clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments ... 如果使用+clipboard编译,则可以使用"* 寄存器访问系统剪贴板。
我下载了7.2源代码并编译它(非常简单:tar xjf vim-7.2.tar.bz && cd vim72 && ./configure && make && sudo make install),并启用了剪贴板。
% which vim
/usr/local/bin/vim
% vim --version
VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Mar 24 2009 17:31:52)
由rampion@Myrrhy.local编译
普通版本,带有GTK2图形用户界面。包括的特性(+)或不包括的特性(-):
...
+clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
...

然而,在终端应用程序中运行vim时,即使编译过了,我仍然无法复制到剪贴板,只能在X11.app中复制。


3
我用带有 "+clipboard" 的最新版本进行了编译,现在本地剪贴板可以作为寄存器 "*" 进行使用。另外,在你的 .vimrc 文件中设置 "set clipboard=unnamed" 可以将系统剪贴板设置为典型的剪贴板。我实际上使用了这个 Homebrew 公式 http://github.com/adamv/homebrew/blob/duplicates/Library/Formula/vim.rb 来构建和编译它。 - rado
不太确定为什么Vim没有出现在我的Homebrew中,但我将其复制到了/usr/local/Library/Formula,运行brew install vim,结果出现“ld: library not found for -lruby-static”的错误。我正在使用RVM,并且使用的是1.8.7版本。当我切换到1.9.2时,错误变成了“ld: library not found for -lruby.1.9.1”。解决方法是首先执行rvm use system来使用系统Ruby。 - justsee
9
比起在通常很长的功能列表中搜索“剪贴板”这个词要容易一些:输入 :echo has("clipboard")。如果显示为0,则表示未编译。如果显示为1,则表示已编译。 - ravron
3
您也可以使用Homebrew编译带有剪贴板功能的Vim:brew install vim - Anton Koval'
请注意,如果您通过Homebrew安装vim,则它只会创建符号链接vim而不是vi,因此vi仍然会启动OS X中包含的vim。我花了一段时间才弄清楚为什么剪贴板仍然无法工作。 - Johann
4
注意!我之前安装了带有+clipboard的版本,但是又安装了启用了+x11--with-client-server版本,在macOS终端中的vim中尝试在X11中进行复制/粘贴操作失败了 :) 我不得不重新安装没有+clientserver的版本。 - jacwah

101

你可以在可视模式下选择文本并输入:w !pbcopy<CR>

或者,你可以将以下关键映射包含在你的~/.vimrc文件中。它们会将在可视模式下剪切/复制的文本保存到操作系统的剪贴板中。

vmap <C-x> :!pbcopy<CR>  
vmap <C-c> :w !pbcopy<CR><CR> 

来源: http://drydevelopment.com/blog/vim-pbcopy-on-os-x


7
你也可以像这样从命令行中选择文本:1,10w !pbcopy,将第1至10行复制到剪贴板中。注意,在w后面加上空格是很重要的,以保留原始文本的位置。上面的来源链接已经失效,但是可以在这里找到相关讨论:http://vim.wikia.com/wiki/Mac_OS_X_clipboard_sharing。 - sdjuan
我按照这个链接中的步骤在tmux中使其工作:http://superuser.com/questions/231130/unable-to-use-pbcopy-while-in-tmux-session - Wex
1
@Wex链接已经修复。 - SnoringFrog
3
请注意,这似乎仅适用于选择整行。如果您只想选择行的一部分,则似乎无法正常工作。https://dev59.com/tHHYa4cB1Zd3GeqPKVrb - Kevin Wheeler
1
@Kevin Wheeler:你可以尝试以下命令,它可以解决非行复制的问题。noremap <silent> <leader>y :<CR>:let @a=@" | execute "normal! vgvy" | let res=system("pbcopy", @") | let @"=@a<CR> - dragonxlwang

84
根据我使用的Vim版本,我能够使用+寄存器来访问剪贴板。
"Mac OS X剪贴板共享"也许对你有帮助。

5
如果使用没有编译+clipboard的VIM,上述链接是一个很好的资源,可提供不重新编译VIM的解决方法。 - sdjuan
非常重要的细节!!!如果您使用的是Vim 7.3版本,则可能无法正常工作,但如果您使用的是Vim 7.4版本,则可以(有时甚至不必执行整个“+y”)。您可以通过在终端中键入>vim,然后启动时查看版本号来检查此内容。 - Zeth
这个答案与此 https://dev59.com/BXRB5IYBdhLWcg3wQVSV#680271 相同。 - Gujarat Santana
1
"+ 寄存器仅存在于 X11(除非您使用 +X11 支持构建 vim,在 OS X 中这将安装 X11 服务器 XQuartz),而 OS X 不使用 X11 作为其窗口系统。 - nn0p
如果vimmacvim都有+clipboard,并且在~/.vimrc中添加了clipboard=unnamed,该怎么办?看起来很麻烦,尝试了所有解决方法,目前不得不使用spacemacs,当我知道我必须使用全局剪贴板时 :) - Nikolay Fominyh
是的,从那个Wikia帖子中可以看出,在OSX上的标准vim中可以使用以下命令:vnoremap <silent><leader>y :<CR>:let @a=@" \| execute "normal! vgvy" \| let res=system("pbcopy", @") \| let @"=@a<CR> - hoodslide

44

在任何复制命令之前添加双引号星号 ("*) 将结果复制到剪贴板中。这也适用于Windows和Linux。


11
对我来说,它似乎只发出一个响铃字符,没有其他效果。 - ʞɔıu
4
在X11中,Vim的“*代表PRIMARY,“+代表CLIPBOARD,SECONDARY则没有被命名为寄存器(不过似乎也没人用它……)。 - ephemient
非常完美。真的很有帮助,特别是块选择(ctrl-v)。 - Sonique
由于问题特别涉及到 Mac OS X,因此添加“也适用于 Mac”是不必要的。 - Paul Tomblin
@PaulTomblin 好的,好吧 :-) - apprenticeDev
最佳回复(在我看来)。对我有用 :) - AndreasHassing

27

在macOS 10.8上,vim编译时使用了-clipboard选项,因此要使用"*y命令需要重新编译。幸运的是,brew install vim将为您轻松编译新版本,并且它将包含+clipboard选项。


1
需要记住的一点是 - 令人惊讶的是,使用更新后的vi而不是vim来安装brew install vim。因此,在使用Homebrew安装vim之后,您可能需要以不同的方式设置别名。 - shridharama

18

可视化选择文本,然后键入:

ggVG
!tee >(pbcopy)

我觉得比起下面这种更好:

ggVG
:w !pbcopy

由于它不会闪现提示:“按ENTER或键入命令以继续”


仍然复制整行 - Karl Pokus

12

11

如果你使用 MacPorts,你可以通过以下方式升级 VIM 以包含剪贴板支持:

port install vim +x +x11

现在您可以使用"+寄存器将文本直接复制到您的Mac剪贴板上。非常方便。


1
这正是我所需要的。只需确保$PATH正确,你就可以得到/opt/local/bin/vim而不是Apple vim。 - Gareth

9
如果你使用的是MacOS X操作系统:
$ brew install vim
$ vim --version
VIM - Vi IMproved 7.4 [...]

然后,在你的 .vimrc 文件中添加以下内容:
set clipboard=unnamed

现在你只需要在 vim 中执行 :%y 命令,即可将所有内容复制到剪贴板中。

内容已经被复制,但我无法在VIM之外粘贴。 - prayagupa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接