关于编辑器:如何从(并复制到)系统剪贴板进行vim粘贴?

How to make vim paste from (and copy to) system's clipboard?

与其他编辑器不同,vim商店将文本复制到自己的剪贴板中。 因此,我很难从网页复制一些文本并将其粘贴到当前的工作文件中。 碰巧我必须打开gedit或手动输入它。

我可以在系统的剪贴板上进行vim粘贴吗?


"*"+寄存器用于系统的剪贴板(:help registers)。根据您的系统,他们可能会做不同的事情。例如,在不使用X11(如OSX或Windows)的系统上,"*寄存器用于读取和写入系统剪贴板。在X11系统上,可以使用两个寄存器。有关详细信息,请参阅:help x11-selection,但基本上"*类似于X11的PRIMARY选择(通常使用鼠标复制您选择的内容并使用鼠标中键粘贴),"+类似于X11的CLIPBOARD选择(其中是适当的剪贴板)。

如果所有这些都超过您的头脑,请尝试使用"*yy"+yy将一行复制到系统的剪贴板。假设您有适当的编译选项,那么一个或另一个应该可以工作。您可能希望将其重新映射到更方便的地方。例如,您可以将vnoremap "*y放在?/ .vimrc中,这样您就可以直观地选择并按Ctrl + c来抓取系统的剪贴板。

请注意,如果:echo has('clipboard')返回0,则无法从系统剪贴板复制/粘贴。在这种情况下,vim不会使用+clipboard功能进行编译,您必须安装其他版本或重新编译它。默认情况下,某些Linux发行版提供了最小的vim安装,但通常如果安装vim-gtkvim-gtk3包,则可以获得额外的功能。

您还可以查看:help cb中描述的'clipboard'选项。在这种情况下,您可以:set clipboard=unnamed:set clipboard=unnamedplus使所有yanking / delete操作自动复制到系统剪贴板。在某些情况下,如果您将其他内容存储在剪贴板中,因为它会覆盖它,这可能会带来不便。

要粘贴,您可以使用"+p"*p(同样,取决于您的系统和/或所需的选择),或者您可以将这些映射到其他内容。我明确地键入它们,但我经常发现自己处于插入模式。如果您处于插入模式,您仍然可以使用*+将它们粘贴到适当的缩进处。见:help i_CTRL-R_CTRL-P

还值得一提的是vim的paste选项(:help paste)。这使得vim进入一种特殊的"粘贴模式",禁用其他几个选项,允许您使用终端仿真器或多路复用器熟悉的粘贴快捷方式轻松粘贴到vim中。只需输入:set paste即可启用它,粘贴您的内容,然后键入:set nopaste以禁用它。或者,您可以使用pastetoggle选项设置切换模式的键码(:help pastetoggle)。我建议使用寄存器而不是这些选项,但如果它们仍然太可怕,那么当你完善你的vim印章时,这可能是一个方便的解决方法。

有关更多详细信息,请参阅:help clipboard


您可以通过gnome-terminal的快捷方式复制到vim中进行粘贴。使文件处于插入模式并使用

Ctrl + Shift + v

请事先记住

1
 :set paste

避免弄乱压痕。


Linux的

在我的Linux系统上,+*寄存器映射到X11选择,可以使用鼠标中键粘贴。当使用:set clipboard=unnamed:set clipboard=unnamedplus时,寄存器映射到剪贴板,并可以用CTRL-V粘贴。

具体细节似乎与配置和系统有关,因此您的里程肯定会有所不同。不过,它肯定会让你指向正确的方向。

也可以看看

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


因为我的配置适用于复制和粘贴

1
2
3
4
5
" copy and paste
vmap <C-c>"+yi
vmap <C-x>"+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa


这将是您在vimrc中为此目的所需的行:

1
2
3
set clipboard+=unnamed " use the clipboards of vim and win
set paste              " Paste from a windows or from vim
set go+=a              " Visual selection automatically copied to the clipboard


我认为这个问题应该得到一个更客观的答案。

进入粘贴模式

  • ESC
  • :设置粘贴
  • i
  • SHIFT + Insert(在剪贴板上复制了文本)

离开粘贴模式

  • ESC
  • :设置nopaste
  • i

您粘贴了文本,然后您可以再次键入。


剪贴板

有一个特殊的寄存器用于存储这个选择,它是"*
寄存器。除非有关于什么文本的信息,否则没有任何内容
选中即将更改(例如,在某处单击鼠标左键),或何时更改
另一个应用程序想要粘贴选定的文本。然后放入文本
在"*寄存器中。例如,切断一条线并使其成为当前的线
选择/把它放在剪贴板上:

1
  "*dd

同样,当您要粘贴其他应用程序中的选择时,例如,
通过单击鼠标中键,选择将放在"*寄存器中
首先,然后'put'像任何其他寄存器一样。例如,要把
选择(CLIPBOARD的内容):

1
  "*p

登记E354

1
2
3
4
5
6
7
8
9
10
> There are nine types of registers:                      
> 1. The unnamed register""
> 2. 10 numbered registers"0 to"9
> 3. The small delete register"-
> 4. 26 named registers"a to"z or"A to"Z
> 5. four read-only registers":,".,"% and"#
> 6. the expression register"=
> 7. The selection and drop registers"*,"+ and"~
> 8. The black hole register"_
> 9. Last search pattern register"/

从剪贴板粘贴

1
2
1. Clipboard: Copy
2. Vim insertmode, middle mouse key

检查终端中的X11剪贴板支持

当您想在终端中运行Vim时,您需要查找使用剪贴板支持编译的Vim版本。
检查X11-clipboard支持,从控制台输入:

1
% vim --version

如果你看到"+ xterm_clipboard",你很高兴。

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

The X server maintains three selections, called:

PRIMARY, SECONDARY and CLIPBOARD

The PRIMARY selection is conventionally used to implement copying and
pasting via the middle mouse button. The SECONDARY and CLIPBOARD
selections are less frequently used by application programs.

http://linux.die.net/man/1/xsel


我尝试了上面的建议,但没有一个在我的环境中工作。 (Windows PuTTY克隆ssh)

一些额外的谷歌搜索出现了:
https://unix.stackexchange.com/questions/110684/copy-paste-into-sshd-vim-from-local-windows-clipboard

其中一条评论建议使用SHIFT+INSERT来完成从桌面剪贴板粘贴到Vim缓冲区的技巧。 Ctrl-C已经在从Vim复制到桌面剪贴板了。


没有+剪贴板所以我想出了使用xsel的替代解决方案:

添加到?/ .vimrc:

vnoremap :w !xsel -b


对于vim安装不支持*和+寄存器的人员的快速说明。没有必要从剪贴板下载新的vim安装进行粘贴。这是另一种方法:

1)安装parcellite(内存占用少的剪贴板管理器);

2)在.vimrc文件中,添加以下内容:

1
command Clip r !parcellite -c

3)重启vim。

现在当您输入:Clip作为ex命令时,剪贴板的内容将粘贴在光标处。您还可以将新命令映射到功能键,以便能够通过一次击键执行此操作。


这对我有用:Ctrl + Shift + V


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

安装vim:

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

安装vim的gui:

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

重启终端才能生效。

将以下行附加到~/.vimrc

set clipboard=unnamed

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


继Conner的答案之后,这很好,但插入模式下的C-R C-p +C-R C-p *有点不方便。从命令模式Ditto "*p"+p

一位VIM大师建议如下将C-v映射到C-R C-p +

You could have :inoremap "+p for insert mode only

if you really wanted to override blockwise visual mode (not recommended by him as visual
mode is good) you could have map "+p


值得一提的是,在使用Vim的OSX上,您可以使用鼠标选择文本,Cmd-C复制到OSX系统剪贴板,复制的文本将在Vim外部的剪贴板中可用。

换句话说,OSX将其视为常规窗口,这就是备受诟病的Apple"Command"按钮派上用场的地方。

B-30


根据@ lis2的答案,我使用了一个更简单的配置,最后不会强制插入模式:

1
2
3
4
5
6
7
" Copy and paste
if has('clipboard') && !has('gui_running')
  vnoremap <C-c>"+y
  vnoremap <C-x>"+d
  vnoremap <C-v>"+p
  inoremap <C-v> <C-r><C-o>+
endif

请注意,所有这些都覆盖默认的Vim映射:

  • v_CTRL-C:停止可视模式
  • v_CTRL-X:从数字中减去[count]
  • v_CTRL-V:blockwise可视模式
  • i_CTRL-V:按字面插入下一个非数字,也映射到i_CTRL-Q

作为替代方案,可以使用分别在"yank","delete"和"put"Vim动词中启发的键:。这些只会覆盖一个默认映射:

  • i_CTRL-P:向后搜索关键字以完成

如果你想改变你的vimrc等其他解决方案是好的...但是我想要一个简单的方法从vim复制到我的系统键盘。这就是我提出的。

  • 使用可视模式v选择要复制的文本
  • :(它将自动展开以显示:'<,'>)
  • 键入y *y +(取决于您的系统)将所选文本拖到系统剪贴板中

你真正需要的是EasyClip。它会做到这一点,还有更多......


对此最简单的解决方案,也可以通过ssh在不同的Linux机器之间运行:

  • 检查vim是否支持X-11剪贴板:vim --version | grep clipboard。如果报告-clipboard-xterm_clipboard,则应安装vim-gtkvim-gnome(在arch linux上使用gvim)

  • 将以下行添加到.vimrc

  • 1
    2
    set clipboard=unnamedplus
    set paste
  • 如果您通过ssh在其他计算机上登录,请使用选项-Y:ssh -Y machine
  • 现在,复制和粘贴应该在单个和不同的机器上完全按预期工作,只需使用y表示yank,p表示粘贴。 NB在要使用此功能的所有计算机上修改.vimrc


    如果您先使用鼠标

    1
     :set paste

    然后right click mouse和缓冲区中的内容将被粘贴


    使用Linux或Mac上的Vim 8+,您现在可以简单地使用操作系统的本机粘贴(Linux上的ctrl+shift+V,Mac上的cmd+V)。不要按i进行插入模式。

    它将粘贴操作系统剪贴板的内容,保留空格和制表符,而不添加自动延迟。它等同于旧的:set pasteictrl+shift+Vesc:set nopaste方法。

    您甚至不再需要安装+clipboard+xterm_clipboard vim功能。此功能称为"括号粘贴"。有关更多详细信息,请参阅将文本粘贴到vim时关闭自动缩进


    :set clipboard=unnamed设置之上,如果你在Mac OS X 10.9上的Terminal.app上使用vim,你应该使用mvim -v来获得brew install macvim。默认vim不支持剪贴板选项。


    我在2017年年中的Macbook Pro上遇到了这个问题,在iTerm2中运行vim作为我的主要开发环境。

    正如其他答案所示,我运行vim --version并注意到它返回-clipboard,这意味着我的机器附带的vim版本尚未使用剪贴板选项进行编译。

    vimhomebrew包似乎使用clipboard选项进行编译,因此我的修复方法是:

  • 运行brew install vim
  • set clipboard+=unnamed添加到我的~/.vimrc文件中
  • 关闭并重新打开iTerm2

  • 当我使用未与Gnome集成的Debian vim时(vim --version | grep clip#显示没有剪贴板支持),我可以在按住Shift键并用鼠标选择文本后复制到剪贴板,就像任何其他诅咒计划。正如我从@Conner的评论中看到的那样,终端(在我的情况下是gnome-terminal)在感知到我的Shift按下时关闭了它的鼠标事件报告。我想基于curses的程序可以在将某个Escape序列发送到终端后接收鼠标事件。


    有两种简单的方法可以做到这一点。使您的文件处于插入模式和
    1)按下鼠标中的中间按钮(滚轮),或
    2)Ctrl + Shift + V.


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

    因此,在这种情况下,您必须按"Space + y"Space * y才能复制。

    "Space + p" Space * p进行粘贴。


    由于vim 8右键单击默认启用可视模式。这可以防止"正常"副本和粘贴(称之为"设计缺陷"https://github.com/vim/vim/issues/1326)。
    通过执行以下操作修复

    echo"set mouse-=a">> ~/.vimrc

    退出并重新启动vim。


    如果您在Windows上并且想要使用p粘贴系统剪贴板的内容,请键入此命令。

    1
    :set clipboard = unnamed

    这解决了我的问题。