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

时间:2010-10-18 17:49:39

标签: vim clipboard

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

36 个答案:

答案 0 :(得分:448)

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

  

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

*可能是你大多数时候想要的,所以我使用*,因为它在两种环境中都能按照我的预期运行。

在Linux发行版中,出于某种原因,您必须先安装vim-gtk才能获得剪贴板功能。

对于那些在yanking或put时如何使用寄存器感到困惑的人,你只需要写"然后写入寄存器的名称。因此,要将某些内容复制到剪贴板注册表,请键入"*y,然后键入"*p

答案 1 :(得分:297)

在Mac OSX

  • 复制所选部分:直观地选择文字(vV 模式)并输入:w !pbcopy

  • 复制整个文件:%w !pbcopy

  • 从剪贴板:r !pbpaste

  • 粘贴

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

  • pbcopy以上xclip -i -sel cxsel -i -b
  • pbpaste使用xclip -o -sel -cxsel -o -b
    - 注意: 如果您的发行版中没有预安装这些工具(xselxclip),您可以在repos中找到它们

答案 2 :(得分:142)

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

在Windows上设置:

set clipboard=unnamed

在Linux上设置(vim 7.3.74 +):

set clipboard=unnamedplus

注意:您可能需要使用最新版本的Vim才能使用它们。

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

答案 3 :(得分:114)

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

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

答案 4 :(得分:66)

@Jacob Dalton在评论中提到过这一点,但似乎没有人在回答中提到vim必须使用剪贴板支持编译,这里提到的任何建议都可以使用。默认情况下我没有在Mac OS X上配置我的方式,我不得不重建vim。使用此命令查明您是否拥有vim --version | grep 'clipboard'+clipboard表示您很好,此处的建议适合您,而-clipboard表示您必须重新编译并重建vim。

答案 5 :(得分:52)

总结并让新手更轻松,

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

"*yy

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

"*yG

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

答案 6 :(得分:23)

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

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

但是如果你接下来添加这一行,它将允许你只需 Ctrl + c 来获取无论你在剪贴板中选择了什么。

vmap <C-c> "+y

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

答案 7 :(得分:20)

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

安装vim:

brew install vim --with-lua --with-override-system-vim

安装vim的vi:

brew install macvim --with-lua --with-override-system-vim

重启终端才能生效。


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

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



更新方法

多年来我一直对set clipboard方法感到满意。最大的缺点是,即使您使用x进行删除,也会破坏剪贴板历史记录。这是一个更好,更优雅的解决方案。

  1. 将vim的文本[范围]复制到系统剪贴板中。 (提示:首先使用vV选择范围,然后键入冒号:以激活Ex命令):
    :[range]yank +
    例如,
    :5,10y *(将5-10行复制到系统剪贴板*注册)

  2. 将系统剪贴板中的内容粘贴到新行的vim中:
    :put +

答案 8 :(得分:18)

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

sudo apt-get install vim-gnome

答案 9 :(得分:16)

对于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

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

祝你好运。

答案 10 :(得分:14)

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

答案 11 :(得分:10)

如果您的vim恰好在没有+xterm_clipboard选项的情况下编译,就像默认情况下在Debian中编译而我猜Ubuntu,您可以选择管道选择或整个缓冲区来处理桌面剪贴板的外部程序。对于xclip(您可能需要先安装),命令将为:w !xclip -sel clip

答案 12 :(得分:10)

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

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

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

set clipboard=unnamedplus

答案 13 :(得分:8)

仅在ubuntu终端下的vim中,

List<String> list = new ArrayList<String>(); for(int i = 0; i < arr.length(); i++){ list.add(arr.getJSONObject(i).getString("name")); } 选择vim中的文本,然后选择终端上的shift + drag mouse

然后ctrl + shift + c在其他编辑器上

答案 14 :(得分:6)

如果您拥有xclip,则将文本复制到剪贴板的简单方法如下:

  1. 要复制的文本。 (香草vim中的y命令)
  2. 输入:call system("xclip -selection clipboard", @")

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

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

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

答案 15 :(得分:4)

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

vnoremap:w!cp / dev / null~ / temp.txt&amp;&amp;猫&gt; 〜/ TEMP.TXT

noremap:r!cat~ / temp.txt

答案 16 :(得分:4)

  1. set clipboard=unnamed放入vimrc
  2. Visual模式下选择要复制的内容(按v进入)。
  3. 返回Normal模式(按escape [esc]),按y复制。
  4. 如果要从操作系统的剪贴板粘贴内容,请在Vim Normal模式下按p / P.

答案 17 :(得分:3)

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

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

"*y

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

答案 18 :(得分:3)

我在Mac OS X(10.15.3)上,并且是vim的新手。我觉得这很令人沮丧,这里的所有答案都太复杂和/或不适用于我的情况。我最终以两种方式使它工作:

  1. key mapping that uses pbcopy:适用于Mac随附的旧版vim。

    vmap '' :w !pbcopy<CR><CR>添加到您的〜/ .vimrc
    现在,您可以直观地选择并点击''(两个撇号)以复制到剪贴板

  2. 安装较新版本的vim,这样我就可以访问在其他答案中最推荐的解决方案:

    brew install vim
    alias vim=/usr/local/bin/vim(应将其添加到您的〜/ .bashrc或等效文件中)
    现在您可以直观地选择并点击"+yy以复制到剪贴板

答案 19 :(得分:3)

我的解决方案是将以下行添加到.vimrc:

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

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

答案 20 :(得分:3)

我是Vim newby但是,要将所有文本复制到系统剪贴板(例如,如果要将其粘贴到文字处理器或其他文本编辑器,如gedit,mousepad等...),则在正常模式下:< / p>

ggVGy

或更简单地说:

<强>:%Y

根据建议,我还安装了 vim-gtk 并添加了

设置clipboard = unnamedplus

在我的.vimrc

一切正常

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

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

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

为我的英语请求我! : - )

答案 21 :(得分:2)

此答案特定于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

现在,您可以将文本拖到系统剪贴板。 以下步骤说明了如何拉动。

  1. 在vim命令模式press v中,这会将您切换到VISUAL模式。
  2. 移动光标以选择要复制的文本或行。
  3. Press y,这会将选定的文本复制到剪贴板。
  4. 转到任何外部应用程序,然后CMD + v粘贴。

我将MacBook Pro与macOS Mojave一起使用,并且可以在其中使用上述功能。

答案 22 :(得分:2)

如果你不想为vim使用任何图形界面,而你更喜欢坚持使用终端模拟器,那么解决这个问题可能会有一个更简单的方法。不要使用yank或类似的东西,首先看一下你使用的终端文档。我一直在努力解决同样的问题(尝试使用+剪贴板和xclip等等),最后我发现在我的终端模拟器中它只需按下shift并选择任何文本你想要复制。就是这样。非常简单,不需要搞乱配置。 (顺便说一下,我使用urxvt。)

答案 23 :(得分:2)

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

所以在这种情况下你必须按 Space + y ”< / KBD> 空间 * ý

答案 24 :(得分:2)

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

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

如果您想阅读有关此功能的详细信息,可以在my blog

上阅读相关内容。

答案 25 :(得分:1)

对于OSX,就像上面提到的10342答案一样,你需要确保vim支持剪贴板功能,表示OSX预先附带的那个不支持剪贴板,如果运行 var count = 0 ; $('#inputEmail').focusout ( function(){ var color = ""; if ( $(this).val() == '' ){ count++; color = "red"; /* Update variable */ $(this).css('border-color',color); console.log('No of times input box focused out: ' + count + ' Current border color: ' + color); } else { color = "green"; /* Update variable */ $(this).css('border-color', color); console.log(' Current border color ' + color); } }); 它会起作用。

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

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

brew install vim

现在我是金色的

答案 26 :(得分:1)

我遇到了问题,因为我的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进行复制和粘贴。

答案 27 :(得分:1)

如果您通过putty连接到unix系统,请按照以下步骤复制文件内容

  • 突出显示要复制的文字(您可以逐页复制)
  • 按ctrl + c(它将文本复制到剪贴板
  • 粘贴在任何外部编辑器中 完成

答案 28 :(得分:1)

我在这个问题上看到了很多答案,而完成这项工作的方法是多种方法的结合。

我将vim复制到系统剪贴板的步骤是

  1. 使用 sudo apt remove vim 卸载 vim。 (我懒得找到如何使用 +clipboard 支持重新编译它。
  2. 使用 +clipboard 附带的 sudo apt install vim-athena 安装一个名为 vim-athena 的不同 vim 包。
  3. 将以下行添加到 ~/.vimrcset clipboard=unnamedplus
  4. 通过进入命令模式并输入 source % 来获取文件。
  5. 保存并退出。

注意: 我使用的是 Ubuntu 20.04。

答案 29 :(得分:1)

我在复制到剪贴板时遇到了很多困难。在 Vim 中,使用可视模式非常简单,但如果你想复制到剪贴板,事情就很麻烦了。我有使用 xclip 实用程序进行复制的简单方法。为此,您必须先安装 xclip。

整个文件很简单

xclip -sel clip filename

但是如果您只想复制特定范围的行号
tail -n +[n1] filename | head -n [n2] | xclip -sel clip

你可以使用 ~/.bashrc 来简化这个

#rangecp copy lines from n1 to n2 from a given file to clipboard
function rangecp()
{
    if [ -f $1 ]
    then
        if [ ! -z $3 ]
        then
            diff=$(($3 - $2 + 1))
            #diff=`expr $3 - $2 + 1`
            tail -n +$2  $1 | head -n $diff | xclip -sel clip
        elif [ ! -z $2 ]
        then
            tail -n +$2  $1 | xclip -sel clip
        else
            echo "Provide a range from [n1] lines to [n2] lines"
        fi
    else
        echo "[ $1 ] file doesn't exist"
    fi
}

然后

source ~/.bashrc
使用方法

rangecp filename.txt 50 89
rangecp filename.txt 50

答案 30 :(得分:0)

我已经使用这些多年了:

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

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

在 ubuntu 21.04、vim 8.2 上测试。

答案 31 :(得分:0)

我想补充一种将行复制到剪贴板并在功能上使用的方法。

下面是在浏览器中打开URL的示例

let g:chrome_exe = 'C:/.../Google/Chrome/Application/chrome.exe'
function OpenURL()
    " copy the line and put it in the register *
    normal "*yy
    :execute "silent !start ".g:chrome_exe." ".getreg("*")
endfunction

map ,url :call OpenURL()<CR>

答案 32 :(得分:0)

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

无论如何,在Mac上,最简单的解决方案是使用'multipart/form-data'以避免进入可视模式。

如果您希望默认情况下避免这种行为,则可以编辑vimrc

答案 33 :(得分:0)

到目前为止,我一直在MacOsX上使用键盘快捷键来为此苦苦挣扎。 我知道问题不在于使用键盘短裤。但这可能会帮助那些同样担心的人。

我发现,如果您取消选中:

  

查看->允许鼠标报告

从“终端”菜单中,您将可以使用

复制到剪贴板
  

命令 + c

再次

答案 34 :(得分:0)

Shift + Ctrl + C 如果您使用的是Linux图形模式,但是首先需要选择要复制的内容。

enter image description here

答案 35 :(得分:0)

我的Windows笔记本电脑上面没有任何功能。

Ctrl + C 可以复制..但我需要 Shift + 插入以粘贴!

(总是可以在不按二级密钥的情况下随时访问 Insert 的笔记本电脑的一个很好的理由)