繁体   English   中英

如何使 vim 从系统的剪贴板粘贴(并复制到)?

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

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

我可以在系统剪贴板中粘贴 vim 吗?

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

如果所有这些都超出您的想象,请尝试使用"*yy"+yy将一行复制到系统的剪贴板。 假设您有适当的编译选项,其中一个应该可以工作。

您可能希望将其重新映射为对您更方便的内容。 例如,您可以将vnoremap <Cc> "*y放在~/.vimrc以便您可以直观地选择并按Ctrl + c猛拉到系统的剪贴板。

请注意,如果:echo has('clipboard')返回 0 ,则从系统剪贴板复制/粘贴将不起作用 在这种情况下,vim 没有使用+clipboard功能编译,您必须安装不同的版本或重新编译它。 一些 linux 发行版默认提供最小的 vim 安装,但如果你安装vim-gtkvim-gtk3包,你仍然可以获得额外的功能。

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

要粘贴,您可以使用"+p"*p (同样,取决于您的系统和/或所需的选择),或者您可以将它们映射到其他内容。 我明确地输入它们,但我经常发现自己处于插入模式。 如果您处于插入模式,您仍然可以使用<Cr><Cp>*<Cr><Cp>+以适当的缩进粘贴它们。 参见: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

记得事先

 :set paste 

以避免弄乱缩进。

我相信这个问题应该得到一个更客观、更形象的答案:

进入粘贴模式

  • ESC键
  • :设置粘贴
  • SHIFT +插入(在剪贴板上复制文本)


离开粘贴模式

  • ESC键
  • :set nopaste

您粘贴了文本,您可以再次输入。

Linux

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

具体细节似乎在某种程度上取决于配置和系统,因此您的里程肯定会有所不同。 不过,它绝对应该让你指向正确的方向。

也可以看看

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

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

" copy and paste
vmap <C-c> "+yi
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa

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

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

剪贴板

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

    "*dd

类似地,当您想从另一个应用程序粘贴一个选择时,例如,通过单击鼠标中键,该选择首先放入“*”寄存器中,然后像任何其他寄存器一样“放入”。例如,将选择放入(剪贴板的内容):

    "*p

寄存器E354

> 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. Clipboard: Copy
2. Vim insertmode, middle mouse key

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

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

% vim --version

如果你看到“+xterm_clipboard”,你就可以开始了。

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

X 服务器维护三个选择,称为:

主要、次要和剪贴板

PRIMARY 选择通常用于通过鼠标中键实现复制和粘贴。 应用程序较少使用 SECONDARY 和 CLIPBOARD 选项。

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

没有 +clipboard 所以我想出了这个使用 xsel 的替代解决方案:

添加到您的 ~/.vimrc:

vnoremap <CC> :w !xsel -b<CR><CR>

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

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

其中一条评论建议使用SHIFT+INSERT ,它可以将桌面剪贴板粘贴到 Vim 的缓冲区中。 Ctrl-C已经在努力从 Vim 复制到桌面的剪贴板。

复制到操作系统剪贴板

在视觉模式下选择文本,按"*y

从操作系统剪贴板粘贴

"*p

对于 vim 安装不支持 * 和 + 寄存器的人的快速说明。 无需下载新的 vim 安装即可从剪贴板粘贴。 这是一种替代方法:

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

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

command Clip r !parcellite -c

3)重新启动vim。

现在,当您输入 :Clip 作为 ex 命令时,剪贴板的内容将粘贴在光标处。 您还可以将新命令映射到一个功能键,以便只需一次按键即可完成此操作。

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

  1. 检查 vim 是否支持 X-11 剪贴板: vim --version | grep clipboard vim --version | grep clipboard 如果它返回-clipboard-xterm_clipboard你应该安装vim-gtkvim-gnome (gvim on arch linux)

  2. .vimrc添加到您的.vimrc

 set clipboard=unnamedplus set paste
  1. 如果您通过 ssh 在不同的机器上登录,请使用选项 -Y: ssh -Y machine

现在,通过仅使用y进行 yank 和p进行粘贴,复制和粘贴应该在单个机器上完全按预期工作,并且可以在不同的机器上工作。 注意在所有要使用此功能的机器上修改.vimrc

这对我有用Ctrl + Shift + V

如果您首先使用鼠标

 :set paste 

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

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

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

vimhomebrew程序包似乎使用clipboard选项进行编译,因此对我来说修复是:

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

这些组合键适用于任何操作系统。

Select 目标文本使用鼠标,并参考键序列进行复制、剪切和粘贴。

  • 复制: Ctrl + Del
  • 粘贴: Shift +插入
  • 剪切: Shift + Del
  • 粘贴: Shift +插入

Shift + 右键单击 -> 粘贴

为我做了伎俩

继康纳的回答之后,这很棒,但是插入模式下的CR Cp +CR Cp *有点不方便。 同上"*p"+p从命令模式。

一位 VIM 大师建议使用以下方法将Cv映射到Cr Cp +作用。

你可以有:inoremap <Cv> <Co>"+p仅用于插入模式

如果你真的想覆盖块视觉模式(他不推荐,因为视觉模式很好)你可以有map <Cv> "+p

如果您在 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追加到~/.vimrc
set clipboard=unnamed

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

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

如果您想更改 vimrc 等,其他解决方案也不错……但是我想要一种vim 复制系统键盘的简单方法。 这就是我想出的。

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

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

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

退出并重新启动 vim。

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

它将粘贴操作系统剪贴板的内容,保留空格和制表符而不添加自动缩进。 它相当于旧的:set paste , i , ctrl+shift+V , esc , :set nopaste方法。

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

如果有,请尝试从 vimrc 中删除它:set mouse=a

它与粘贴功能混乱。

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

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

B-30

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

基于@lis2 的回答,我使用了一个更简单的配置,它不会在最后强制插入模式:

" 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 : 分块视觉模式
  • i_CTRL-V :按字面插入下一个非数字,也映射到i_CTRL-Q

作为替代方案,可以使用受“yank”、“delete”和“put”Vim 动词启发的键:分别为<Cy><Cd><Cp> 这些只会覆盖一个默认映射:

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

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

在 Linux (Ubuntu 20.04) 中对我有用的东西

  • 复制到系统剪贴板:

    1. 在可视模式下选择要复制的内容。
    2. 输入"+y
    3. Enter
  • 在系统剪贴板中粘贴一些东西:

    1. 移动到要在 vim 中粘贴复制文本的位置。
    2. 只需键入"+P在光标前粘贴/ "+p在光标后粘贴。

要了解更多这是如何工作的从/到其他程序复制和粘贴到/从 Vim!

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

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

:set clipboard = unnamed

这解决了我的问题。

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

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

空格+ p”空格* p”来粘贴。

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

我可以在系统剪贴板中粘贴vim吗?

进入vim窗口后,按I进入插入模式。 然后将光标移动到所需位置并同时按下Ctrl +插入按钮以从剪贴板粘贴。

Mac OS X:

  1. 运行vim --version | grep clipboard vim --version | grep clipboard检查剪贴板是否启用(带+)
  2. 添加set clipboard=unnamed to.vimrc
  3. 重启终端& vim

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM