ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Vim 中复制到剪贴板?

是否可以直接从 Vim 复制到剪贴板? yy 仅将内容复制到 Vim 的内部缓冲区。我想复制到操作系统的剪贴板。 Vim 中有没有这样的命令,或者你只能在 Vim 中拉取东西?

请参阅投票不足的答案,该答案澄清了一个重要事实:您必须使用 +clipboard 功能编译 vim 才能首先使用以下任何建议!这不是大多数系统的默认设置。
@NeilTraft,一些答案建议从 vim 到外部程序的管道,因此任何答案都需要 +clipboard 标志的说法是错误的。只是指出以使未来的读者免于困惑。
How to make vim paste from (and copy to) system's clipboard? 的可能重复项(注意:另一个问题较新,但有更好的答案恕我直言,这就是为什么我将这个问题标记为骗子)
确保您已完成 sudo apt-get install vim-gnome 在应用以下这些命令之前,否则您将收到 Invalid Register 错误!
@Harnirvair 对于这里的许多读者来说,vim-gnome 可能在他们的操作系统/发行版中过度使用或根本不可用,而我怀疑 vim-gtk 并且最好是 vim-gtk3 更有可能存在并提取更少的依赖项,同时仍提供剪贴板集成(至少对于那些还在 X11 上的人来说;我不确定这一切是如何与 Wayland 交互的)。

S
Sudo Bash

* 寄存器将执行此操作。在 Windows 中,+* 是等效的。在 unix 中,+* 之间存在细微差别:

在 Windows 下,* 和 + 寄存器是等效的。但是,对于 X11 系统,它们有所不同。对于 X11 系统,* 是选择,+ 是剪切缓冲区(如剪贴板)。 http://vim.wikia.com/wiki/Accessing_the_system_clipboard

* 可能是您大部分时间想要的,所以我使用 *,因为它在两种环境中都能正常工作。

在 Linux 发行版中,您必须先安装 vim-gtk(又名 gvim)才能获得剪贴板功能。这是因为非 gtk vim 通常在没有 X11 支持的情况下编译。这是为了允许它在仅控制台的机器(通常是服务器)上运行。

对于那些在 yanking 或 put 时如何使用寄存器感到困惑的人,您只需写 " 然后是寄存器的名称。因此,要将某些内容复制到剪贴板寄存器,请输入 "*y,然后输入 "*p(来源:Kyle Mathews)


不适用于 mac osx lion。按“然后*”后,当你不能做某事时,它会发出Mac发出的声音。我该如何在Mac上做到这一点?
您还必须确保在编译 vim 时支持剪贴板。 Ubuntu 中的默认 vim 不是。试试 vim --version|grep .xterm_clipboard -o,如果是 -,那么您没有支持。根据 ubuntuforums.org/showthread.php?t=1686955 下载不同的版本
如果您使用的是 Linux,则应+注册。例如,如果您想将三行复制到系统的剪贴板,请使用 v3j"+y 之类的命令,然后您可以将它们粘贴到另一个应用程序或另一个 VIM 中。在 Linux 下使用 * 寄存器只能在不同的 VIM 应用程序之间进行复制和粘贴。
在 Linux 上,* 寄存器不适用于外部复制和粘贴。
weberc2 和 diabloneo,* 寄存器用于选择剪贴板,可通过中键访问,而不是菜单粘贴或 ^V
h
holms

在 Mac OS X 上

复制所选部分:直观地选择文本(在正常模式下输入 v 或 V)并输入 :w !pbcopy

复制整个文件 :%w !pbcopy

从剪贴板粘贴 :r !pbpaste

在大多数 Linux 发行版上,您可以替换:

pbcopy 上面带有 xclip -i -sel c 或 xsel -i -b

pbpaste 使用 xclip -o -sel -c 或 xsel -o -b -- 注意:如果这些工具(xsel 和 xclip)都没有预装在您的发行版上,您可能可以在 repos 中找到它们


与小牛 osx 附带的 vim 兼容。添加到您的 .vimrc vnoremap <C-c> :w !pbcopy<CR><CR> noremap <C-v> :r !pbpaste<CR><CR> 要使用此映射,如果要复制,请在可视模式下突出显示文本并按 Ctrl-c 进行复制。要从系统剪贴板粘贴,请按 Ctrl-v。
在 linux 上,这适用于 :w !xclip -sel c 或 :w !xsel -b
对于 Linux Ctrl+C 复制:在 ~/.vimrc 添加:vnoremap <C-C> :w !xclip -i -sel c<CR><CR>
一个比接受的答案更有帮助的答案。谢谢!
我在 Mac 中,vim 显示 +clipboard 并且 :w !pbcopy:%w !pbcopy 复制整个文件
G
Gary Willoughby

在您的 vimrc 文件中,您可以指定自动使用系统剪贴板进行复制和粘贴。

在 Windows 设置上:

set clipboard=unnamed

在 Linux 集 (vim 7.3.74+) 上:

set clipboard=unnamedplus

注意:您可能需要使用最新版本的 Vim 才能使这些工作。

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


作为您笔记的附录 - 您可能还必须安装额外的软件包才能使其正常工作。如果您的 vim 缺少 +xterm_clipboard 功能(运行 vim --version 时可见)。我就是这种情况(运行 Kubuntu 12.10)。我必须安装 vim-gui-common 软件包才能获得正确的功能。
set clipboard=unnamed 适用于 Mac OS 10.11.6 (El Capitan) 和 vim 7.4
您可能希望更新您的答案。它在带有 vim 8.0 的 Ubuntu 18.04 上不起作用。
这适用于我的 nvim 0.4.4。谢谢!要复制整个文件,我使用 ggvGGy
set clipboard^=unnamed,unnamedplus 将为 Windows 和 Linux 解决这个问题。不确定Mac。
C
Cascabel

使用寄存器 "+ 复制到系统剪贴板(即 "+y 而不是 y)。

同样,您可以从 "+ 粘贴以从系统剪贴板获取文本(即 "+p 而不是 p)。


我用的是"*,但是好像只有X有区别。
@dash-tom-bang:+/* 的区别是 SELECTIONPRIMARY 复制缓冲区(不记得哪个是哪个 atm)
是的星是选择,加上是剪贴板。
双引号字符用作 vi 和 vim 中的寄存器选择器。
要记住的两组快捷方式:"+yy(复制行到剪贴板)和"+yy(复制行到选择); "+p(从剪贴板粘贴)和 "*p(从所选内容粘贴)。 " 是选择寄存器,它是 vim 自己的内部寄存器,默认情况下(yyp 将在不引用 any 类型的寄存器的情况下工作)。 PS:我想知道 Vim 自己的内部寄存器是否有一个字符,例如 "&yy,默认情况下会变成 yy
g
gkb0986

@Jacob Dalton 在评论中提到了这一点,但似乎没有人在回答中提到必须使用剪贴板支持编译 vim 才能使此处提到的任何建议起作用。默认情况下,我的 Mac OS X 上没有这样配置,我不得不重建 vim。使用此命令来确定您是否拥有它 vim --version | grep 'clipboard'+clipboard 表示你很好,这里的建议对你有用,而 -clipboard 表示你必须重新编译和重建 vim。


或者,您可以安装一个已经使用剪贴板支持构建的 vim 包,而不是自己编译。在 OS X 上,Homebrew 有这个:brew install vim。在 Ubuntu 上,您可以使用 sudo apt-get install vim-gnome。在其他(非 GNOME)Linux 发行版上,您可能宁愿安装 vim-gtkvim-athena
谢谢,在 Arch Linux 中我必须删除 vim 并安装 gvim wiki.archlinux.org/index.php/Vim#Installation
您的答案正在解释为什么 yank 不能与剪贴板一起使用,仅凭您的信息,我就可以进行更好的谷歌搜索并使其轻松工作。现在它工作了。如果您还在您的答案中包含@NeilTraft 评论会更好,这样人们就不需要进行谷歌搜索。
在 Mac 上,在 brew install vim 之后,我将 set clipboard=unnamed 添加到 .vimrc。在命令行中运行 source ~/.vimrc。在 .bash_profile 中,我添加了 alias vim="/usr/local/bin/vim",然后运行 source ~/.bash_profile。现在在 vim 中只需使用 yp 来复制/粘贴
r
ryenus

总结一下,方便新手,

要复制当前行,请在命令模式下键入:

"*yy

要复制整个文件/缓冲区,在命令模式下,首先通过 gg 转到开头,然后键入

"*yG

如前所述,这需要 vim --version 中的 +clipboard,这表明剪贴板支持的可用性,-clipboard 表示不支持。


"*5yy5 lines yanked 但剪贴板中什么也没有?操作系统/x。
是的,我已验证 +剪贴板
.vimrc 中的 nnoremap <leader>c "* 可以很好地用作各种“副本”,然后是一个动作,将您想要复制到操作系统剪贴板中的文本对象抓取。
我安装了 vim-gtk 以将 -clipboard 变成 +clipboard,而不是 "+yy 工作。
最好的解决方案是在 Linux 上使用 "+yG
d
desgua

对于 Ubuntu - 2018 年 7 月

使用寄存器“+”复制到系统剪贴板(即“+y而不是y”)。

同样,您可以从“+”粘贴以从系统剪贴板获取文本(即“+p 而不是 p)。

您还必须确保在编译 vim 时支持剪贴板。尝试:

vim --version | grep .xterm_clipboard -o 

如果它是 -xterm_clipboard (减号前缀),那么您没有支持。

以下是使用支持剪贴板的工作版本的 vim 换出的一些说明。

$ sudo apt-get purge vim

$ sudo apt-get autoremove(从系统中删除任何无关的 vim 依赖包)

$ sudo apt-get install vim-gnome(或 sudo apt-get install vim-gtk3 用于较新的 Ubuntu 版本)

使用 vim --version | grep .xterm_clipboard -o 再次检查,您可以确认剪贴板现在可用(即。+xterm_clipboard

祝你好运。


你成就了我的一天,或者我的一个月。在 Ubuntu 上使用无剪贴板 vim 辛勤工作多年后,这是一种了不起的感觉。阿克塞尔顿,谢谢!!
除了上述内容之外,我还必须将 set clipboard=unnamedplus 放入我的 .vimrc 文件中才能使 yank 工作。我正在使用 Ubuntu 18.04。
a
anonymous

如果您在 MAC OSX 中使用 vim,不幸的是它带有较旧的版本,并且不符合剪贴板选项。幸运的是,自制软件可以轻松解决这个问题。

安装vim:

brew install vim

安装vim的gui版本:

brew install macvim

重启终端生效。


将以下行追加到 ~/.vimrc
set clipboard=unnamed

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

更新方法:

多年来,我从未对设置剪贴板方法感到满意。最大的缺点是它会弄乱您的剪贴板历史记录,即使您使用 x 进行删除也是如此。这是一个更好,更优雅的解决方案。

将 vim 的文本 [range] 复制到系统剪贴板中。 (提示:先使用 v 或 V 选择范围,然后输入冒号 : 以激活 Ex 命令): :[line-range]yank + 例如 :5,10y * (复制/将第 5-10 行复制到系统剪贴板 * 注册) 将系统剪贴板中的内容粘贴到 vim 中的新行: :put +

笔记:

如果您选择一个单词范围,上述将不起作用。使用 "*y 或 "+y 将此可视块保存到剪贴板。但是这很难输入,我仍在考虑替代方案。 :help "* 或 :help *+ 获取更多信息 brew info vim 将能够看到安装 vim 的其他选项。目前它没有任何其他选项。


--with-override-system-vim 应该是 --with-override-system-vi
我想尝试这样做以避免在最小系统上安装大量 Xorg 东西,但我错过了一些东西。在 v 模式下选择然后点击 ":" 后,我得到 "Not an editor command [range]yank +" 。
C
Community

我无法复制到剪贴板的系统,因为我的 ~/.vimrc 文件中有这个:

 if has('mouse')
   set mouse=a
 endif

但是,如果您接下来添加此行,它将允许您简单地 Ctrl+c 将您选择的任何内容放入剪贴板。

vmap <C-c> "+y

原始讨论和更多细节:Copy text out of vim with set mouse=a enabled


我没有将该行添加到我的 .vimrc,但您提供的链接非常有用。如果在 vim 中选择文本时按住 SHIFT,则可以在不进入可视模式的情况下复制文本。所以谢谢和+1。
换档技巧是我需要的。在提示符下使用 Ctrl+Shift+c 进行复制的终结器等编辑器也能正常工作,这是我最初尝试的方法。我确实用 vim 安装了 -xterm_clipboard。
J
Joseph

此答案特定于 MAC 用户。

MAC 可用的默认 VIM 没有启用剪贴板选项。您需要该选项才能访问系统剪贴板。

要检查您的 vim 是否启用了该选项,请使用以下命令

vim --version

结果,您应该有 +clipboard。如果是 -clipboard,那么你的 VIM 没有访问系统剪贴板的选项。

你需要使用你需要的选项来制作和安装你的 VIM。以下是命令。

# Create the directories you need
$ sudo mkdir -p /opt/local/bin
# Download, compile, and install the latest Vim
$ cd ~
$ git clone https://github.com/vim/vim.git
$ cd vim
$ ./configure --prefix=/opt/local
$ make
$ sudo make install
# Add the binary to your path, ahead of /usr/bin
$ echo 'PATH=/opt/local/bin:$PATH' >> ~/.bash_profile
# Reload bash_profile so the changes take effect in this window
$ source ~/.bash_profile"

以上将安装启用选项 +clipboard 的最新 VIM。

现在您需要设置系统剪贴板。将以下行附加到 ~/.vimrc

set clipboard=unnamed

现在您可以将文本拉到系统剪贴板。下面的步骤解释了如何拉动。

在 vim 命令模式下按 v,这会将您切换到 VISUAL 模式。四处移动光标以选择需要复制的文本或行。按 y,这会将选定的文本复制到剪贴板。转到任何外部应用程序和 CMD + v 粘贴。

我将 MACBook Pro 与 macOS Mojave 一起使用,上面的方法可以在其中使用。


S
Supawat Pusavanno

仅在 ubuntu 终端下的 vim 中,

shift + drag mouse 在 vim 中选择文本,然后在终端上按 ctrl + shift + c

然后 ctrl + v 在其他编辑器上


这适用于仅选择 vim 中可见的内容,如果您想选择整个文件怎么办?
@Gerep 此方法不适用于整个文件选择。最好仅在 vim 终端上选择一段文本以及在终端屏幕上显示文本的位置。
这会复制行号、分割的缓冲区边界以及所有可见的内容,而不仅仅是文本/代码。
A
AbcAeffchen

我的解决方案是安装包含剪贴板选项的附加 vim:

sudo apt-get install vim-gnome

这就是我必须为 Ubuntu 16.04 做的事情。我尝试了其他建议但没有成功。这是最简单的,用 "+y.
它就像一个魅力,没有任何 vimrc 更改!在 Ubuntu 16.04 中仍然有效
"+y 建议仅适用于 vim-gnome。使用 Linux Mint 18.2。
H
HOuadhour

您可以在这里找到答案Arch Wiki

对于 Linux:首先您必须通过安装 gvim 在您的 vim 版本中启用剪贴板。

接下来,您必须将此行放在您的 .vimrc 文件中。

set clipboard=unnamedplus


+1,很惊讶现在需要此步骤。在我之前的所有 Arch 安装中,我都不必这样做。
也为 ubuntu 18.04 工作并在 tmux 中运行。谢谢!
B
Benoit

如果您使用 GVim,您也可以set guioptions+=a。这将触发自动将您在可视模式下突出显示的文本复制到剪贴板。
缺点:请注意,在这种情况下,高级剪贴板管理器(带有历史记录)将获取您的所有选择历史记录……


J
Jogendra Kumar

这个问题已经有很多答案了。我正在添加我认为很快的方式。

很快,您可以按 V (Shift + v) 进入活动视觉模式。在可见模式下,您可以使用 jk 选择要复制的文本。选择后,使用

"*y

现在,选定的文本被复制到剪贴板。


对于 Mac OS X:工作简单而完美。确保您已打开“+剪贴板”,请参阅 gkb0986 答案。
开箱即用 - Big Sur,iTerm2
C
Ciro Santilli Путлер Капут 六四事

我已经使用这些多年了:

nnoremap Y "+y
vnoremap Y "+y
nnoremap yY ^"+y$

您现在可以只使用大写 Y 复制到剪贴板,而小写 y 不会受到影响,例如受 set clipboard=unnamed 影响,因此您仍然可以选择是否复制到剪贴板。

在 ubuntu 21.04、vim 8.2 上测试。


好主意,非常感谢。像魅力一样工作。
我在 Manjaro Linux 上使用 vim,并且该软件包不支持 clipboard,因此键盘映射对我不起作用,所以我用 vim-clipboard 软件包替换了我的 vim 软件包,然后剪贴板现在可用并且键盘映射在职的。
J
John AZ1

如果你有 xclip 一种将文本复制到剪贴板的简单方法,如下所示:

Yank 要复制的文本。 (原版 vim 中的 y 命令)输入 :call system("xclip -selection clipboard", @")

:call system() 运行终端命令。它需要两个参数,第一个是命令,第二个是要通过管道传递给该命令的内容。例如 :echom system("head -1", "Hello\nWorld") 返回 Hello(带有一些填充)。 echom 返回命令的输出, call 不返回。

xclip -selection clipboard 只是将文本复制到系统剪贴板,而不是默认的 X 剪贴板,(通过中间的鼠标按钮访问)。

@" 返回最后被抽出的文本。 " 是默认寄存器,但您可以使用任何寄存器。要查看所有寄存器的内容,请键入 :registers


这更健壮,即使在 vim 不支持剪贴板和任何操作系统时也能正常工作。例如,在 Mac 上运行 :call system("pbcopy",@")。可以将此命令绑定到一个键。
它工作正常,但我可以把它放在我的 vimrc 中,它会工作吗?它不适合我。
H
Hnatt

如果你的 vim 碰巧在没有 +xterm_clipboard 选项的情况下编译,就像 Debian 和我猜是 Ubuntu 一样,你可以将选择或整个缓冲区通过管道传输到处理桌面剪贴板的外部程序。对于 xclip(您可能需要之前安装),命令将是 :w !xclip -sel clip


谢谢你 - 它在 Ubuntu 上对我不起作用(所以确认你的 Ubuntu 猜测是正确的)很长时间了,我不知道为什么。现在我可以在 vim --version 时显示的标志中看到 -xterm_clipboard
这帮助我找到了剪贴板支持的良好来源:vimcasts.org/blog/2013/11/getting-vim-with-clipboard-support
G
GO.exe

几个月来我一直在使用键盘快捷键在 MacOsX 上为此苦苦挣扎。我知道问题不在于使用键盘短裤。但这可能会帮助有同样问题的人。

我发现如果你取消选中:

查看 -> 允许鼠标报告

从终端菜单,您将能够使用复制到剪贴板

命令 + c

再次。


⌘ + R = "查看 -> 允许鼠标报告" 👍🏻
B
BigPa

把 set clipboard=unnamed 放到你的 vimrc 中。在可视模式下选择要复制的内容(按 v 进入)。返回正常模式(按 escape[esc]),按 y 复制。如果你想从操作系统的剪贴板粘贴一些东西,在 Vim 普通模式下按 p/P。


B
Bertrando Goio

我是 Vim 新手,但是,在正常模式下将所有文本复制到系统剪贴板(例如,如果你想将其粘贴到文字处理器或其他文本编辑器,如 gedit、鼠标垫等......):

ggVGy

或者,更简单地说:

:%y

正如建议的那样,我还安装了 vim-gtk 并把

设置剪贴板=未命名加号

在我的 .vimrc

一切正常

如果您只想复制部分文本,请使用可视模式 (v),选择要复制的文本并按 y。

最后,我建议使用 Clipman(我最喜欢的)、Clipit、Parcellite 或类似的剪贴板程序。

(我在 Debian Stretch Xfce 中使用 vim 8.0)

原谅我的英语! :-)


M
Matheus Baldissara

我的解决方案是将以下行放入 .vimrc:

map <C-y> :w !xclip -sel c <CR><CR>

该脚本使用 Ctrl + y 将选定的行(通过可视模式)或文件内容(如果未选择)复制到剪贴板。如果这很重要,我正在使用 Manjaro Linux。


好东西!对我来说效果很好。
谢谢,这很好用!只需要一种方法将我的选择快速复制到剪贴板,因为它跨越了终端视图。
这适用于 macOS 上的 vi/vim
u
user4897781

也许有人会发现它很有用。我想独立于 X 剪贴板,并且仍然能够在两个正在运行的 vim 之间复制和粘贴一些文本。这个小代码将选定的文本保存在 temp.txt 文件中以进行复制。将下面的代码放入您的 .vimrc 中。使用 CTRL-c CTRL-v 来完成这项工作。

vnoremap :w !cp /dev/null ~/temp.txt && cat > ~/temp.txt

noremap :r !cat ~/temp.txt


a
alagris

如果您不想为 vim 使用任何图形界面,而您更喜欢只使用终端仿真器,则可能有一种更简单的方法来解决这个问题。不要使用 yank 或类似的东西,先看看你使用的终端的文档。我一直在为同样的问题苦苦挣扎(尝试使用 +clipboard 和 xclip 等),最后发现在我的终端模拟器中,只需按下 shift 并选择要复制的任何文本就足够了。而已。很简单,不需要搞乱配置。 (顺便说一下,我使用 urxvt)。


m
me_astr

我遇到了问题,因为我的 vim 不支持剪贴板:

vim --version | grep clip
-clipboard       +insert_expand   +path_extra      +user_commands
+emacs_tags      -mouseshape      +startuptime     -xterm_clipboard

我安装了 vim-gnome (支持剪贴板),然后再次检查:

vim --version | grep clipboard
+clipboard       +insert_expand   +path_extra      +user_commands
+emacs_tags      +mouseshape      +startuptime     +xterm_clipboard

现在我可以分别使用 "+y 和 "+p 进行复制和粘贴。


D
Dharam

我在 mac osx (10.15.3) 和 vim 新手。我发现这很令人沮丧,这里的所有答案都太复杂和/或不适用于我的情况。我最终以两种方式完成了这项工作:

使用 pbcopy 的键映射:适用于 mac 附带的旧版本 vim。添加 vmap '' :w !pbcopy 到您的 ~/.vimrc 现在您可以直观地选择并点击 ''(两个撇号)以复制到剪贴板 安装较新版本的 vim 以便我可以访问最推荐的解决方案在其他答案中: brew install vim alias vim=/usr/local/bin/vim (应该将其添加到您的 ~/.bashrc 或等效项中)现在您可以直观地选择并点击“+yy 复制到剪贴板


非常好的解决方案!
s
songz

我在我的 .vimrc 中写了一个简单的行来让复制工作。希望这可以帮助某人。不幸的是,我的 vim 没有安装剪贴板支持,所以这些建议都不适合我。基本上,将此行粘贴到您的 .vimrc 中:

map <C-c> y:e ~/clipsongzboard<CR>P:w !pbcopy<CR><CR>:bdelete!<CR>

如果您想详细了解它的作用,可以在 my blog 上阅读


买家小心。在 mac 上,这有奇怪的效果。
按照说明使用时,这似乎不会将任何内容复制到剪贴板(在 linux ubuntu 16.04 上,不支持剪贴板),并且如果在 vim 会话中打开多个文件,将关闭执行操作的选项卡(视觉选择和抄送)。
A
Arthur F

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

因此,在这种情况下,您必须按“Space+y 或”Space*y


a
abbood

对于 OSX,就像上面明确的 10342 答案一样,你需要确保 vim 支持剪贴板功能,说 OSX 预装的那个不支持剪贴板,如果你运行 brew install vim 它会工作.

除了运行 vi 仍然会让你运行预装的 OSX 版本,而不是你从 brew 安装的那个。

为了克服这个问题,我只是将我的 vim 命令别名为 brew 版本,而不是 OSX 默认的:

alias vim="/usr/local/Cellar/vim/8.0.1100_1/bin/vim"

现在我是金色的


M
MochiJump

在我的实例中,通过用鼠标突出显示(单击并拖动)来选择文本导致 vim 进入可视模式。

无论如何,在 Mac 上,最简单的解决方案是使用 fn + mouse click and drag 来避免进入可视模式。

如果你希望默认避免这种行为,你可以编辑你的 vimrc