与其他编辑器不同,vim 将复制的文本存储在自己的剪贴板中。因此,我很难从网页中复制一些文本并将其粘贴到当前的工作文件中。碰巧我必须打开 gedit 或手动输入。
我可以在系统的剪贴板上进行 vim 粘贴吗?
sudo apt-get install vim-gnome
,这会将功能添加到使用系统剪贴板的内置 vim 中。
vim-gnome
可能在他们的操作系统/发行版中过度使用或根本不可用,而我怀疑 vim-gtk
并且最好是 vim-gtk3
更有可能存在并提取更少的依赖项,同时仍提供剪贴板集成(至少对于那些还在 X11 上的人来说;我不确定这一切是如何与 Wayland 交互的)。
请注意,如果 :echo has('clipboard')
返回 0,从系统剪贴板复制/粘贴将不起作用。在这种情况下,vim 没有使用 +clipboard
功能进行编译,您必须安装不同的版本或重新编译它。一些 Linux 发行版默认提供最小的 vim 安装,但如果您安装 vim-gtk
或 vim-gtk3
软件包,您仍然可以获得额外的功能。
"*
和 "+
寄存器用于系统的剪贴板 (:help registers
)。根据您的系统,他们可能会做不同的事情。例如,在 OSX 或 Windows 等不使用 X11 的系统上,"*
寄存器用于读取和写入系统剪贴板。在 X11 系统上,两个寄存器都可以使用。有关详细信息,请参阅 :help x11-selection
,但基本上 "*
类似于 X11 的 _PRIMARY_
选择(通常复制您用鼠标选择的内容并用鼠标中键粘贴),"+
类似于 X11 的 {9 } 选择(这是正确的剪贴板)。
如果这一切都超出了您的想象,请尝试使用 "*yy
或 "+yy
将一行复制到系统的剪贴板。假设您有适当的编译选项,一个或另一个应该可以工作。
您可能希望将其重新映射为对您更方便的东西。例如,您可以将 vnoremap <C-c> "*y
放在 ~/.vimrc
中,这样您就可以直观地选择并按 Ctrl+c 拉动到系统的剪贴板。
您可能还想查看 :help cb
中描述的 'clipboard'
选项。在这种情况下,您可以使用 :set clipboard=unnamed
或 :set clipboard=unnamedplus
使所有拉/删除操作自动复制到系统剪贴板。在某些情况下,当您在剪贴板中存储其他内容时,这可能会带来不便,因为它会覆盖它。
要粘贴,您可以使用 "+p
或 "*p
(同样,取决于您的系统和/或所需的选择),或者您可以将它们映射到其他东西。我明确地键入它们,但我经常发现自己处于插入模式。如果您处于插入模式,您仍然可以使用 <C-r><C-p>*
或 <C-r><C-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。
记得提前
:set paste
以避免弄乱缩进。
:set paste
。 stackoverflow.com/questions/11489428/…
我相信这个问题应该得到一个更客观、更形象的答案:
进入粘贴模式
ESC键
:设置粘贴
按我
SHIFT + 插入(在剪贴板上复制文本)
离开粘贴模式
ESC键
:set nopaste
按我
您粘贴了文本,您可以再次输入。
:set nopaste
什么都不做。它应该做什么?为什么我需要它?
:set nopaste
时,您是在告诉编辑器您不想再粘贴了。当您点击 i
时,您将返回编辑模式 :)。
对于我来说,该配置适用于复制和粘贴
" copy and paste
vmap <C-c> "+yi
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa
Linux
在我的 Linux 系统上,+
和 *
寄存器映射到 X11 选择,可以用鼠标中键粘贴。当使用 :set clipboard=unnamed
和 :set clipboard=unnamedplus
时,寄存器映射到剪贴板,并且可以使用 CTRL-V 粘贴。
细节似乎在某种程度上取决于配置和系统,因此您的里程肯定会有所不同。不过,它绝对应该让你指向正确的方向。
也可以看看
http://vim.wikia.com/wiki/Accessing_the_system_clipboard
*
映射到 X11 主寄存器(通常由鼠标粘贴)。 +
映射到通常由快捷方式粘贴的 X11 剪贴板寄存器。
*
作为主要寄存器和 +
作为剪贴板 X11 寄存器的事实,您可以在 vim 源代码中看到这一点:these 值在那里设置并且从未修改, clip_star
和 clip_plus
始终分别用于 *
和 +
寄存器。
这将是您在 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
set go+=a
,请阅读 vimhelp.org/options.txt.html#'guioptions'
剪贴板
有一个特殊的寄存器用于存储这个选择,它是 "* 寄存器。除非关于所选择的文本的信息即将改变(例如用鼠标左键单击某处),或者当另一个应用程序想要改变时,否则这里没有任何内容粘贴选定的文本。然后将文本放入“* 寄存器。例如,要剪切一条线并使其成为当前选择/将其放在剪贴板上:
"*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 PRIMARY 选择通常用于通过鼠标中键实现复制和粘贴。 SECONDARY 和 CLIPBOARD 选项很少被应用程序使用。
http://linux.die.net/man/1/xsel
没有 +clipboard 所以我想出了这个使用 xsel 的替代解决方案:
添加到你的 ~/.vimrc:
vnoremap <C-C> :w !xsel -b<CR><CR>
vnoremap <C-C> :w !xclip -i -sel c<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 复制到桌面的剪贴板。
SHIFT+INSERT
之所以有效,是因为它是您的终端(或者在您的情况下是 PuTTY)的粘贴选项;但是,缩进很可能是错误的。查看我关于 paste
选项的答案的最后一段以更正此问题。
SHIFT+INS
从 linux 主机到 ssh vim 以及鼠标第三次单击都有效。
复制到操作系统剪贴板
在可视模式下选择文本,按 "*y
从操作系统剪贴板粘贴
按"*p
最简单的解决方案(也可以通过 ssh
在不同的 Linux 机器之间工作)是:
检查 vim 是否支持 X-11 剪贴板:vim --version | grep 剪贴板。如果它返回 -clipboard 和 -xterm_clipboard 你应该安装 vim-gtk 或 vim-gnome (gvim on arch linux) 将以下行添加到你的 .vimrc 中:
设置剪贴板=未命名加设置粘贴
如果您通过 ssh 在另一台机器上登录,请使用选项 -Y:ssh -Y machine
现在,复制和粘贴应该在单个机器上和跨不同机器上完全按照预期工作,只需使用 y
进行 yank 和 p
进行粘贴。注意在您要使用此功能的所有机器上修改 .vimrc
。
给 Vim 安装不支持 *
和 +
寄存器的人的快速说明。无需下载新的 Vim 安装即可从剪贴板粘贴。这是另一种方法:
安装 parcellite(一个内存占用少的剪贴板管理器);在您的 .vimrc 文件中,添加以下内容: command Clip r !parcellite -c 重新启动 vim。
现在,当您输入 :Clip
作为 ex
命令时,剪贴板的内容将被粘贴到光标处。您还可以将新命令映射到功能键,以便能够一键完成此操作。
如果您先使用鼠标,请执行
:set paste
然后 right click mouse
和缓冲区中的内容将被粘贴
这对我有用:Ctrl+Shift+V
我在 2017 年中期的 Macbook Pro 上遇到了这个问题,该 Macbook Pro 在 iTerm2
内运行 vim
作为我的主要开发环境。
正如其他答案所建议的那样,我运行 vim --version
并注意到它返回 -clipboard
,这意味着我的机器附带的 vim
版本尚未使用剪贴板选项进行编译。
vim
的 homebrew
包似乎使用 clipboard
选项进行编译,因此对我的修复是:
运行 brew install vim 将 set clipboard+=unnamed 添加到我的 ~/.vimrc 文件中 关闭并重新打开 iTerm2
继康纳的回答之后,这很好,但插入模式下的 C-R C-p +
和 C-R C-p *
有点不方便。命令模式中的 "*p
和 "+p
同上。
一位 VIM 专家建议将 C-v
映射到 C-r C-p +
的功能。
:inoremap
在 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 功能。此功能称为“括号粘贴”。有关详细信息,请参阅Turning off auto indent when pasting text into vim
在 Linux (Ubuntu 20.04) 中对我有用的东西
复制到系统剪贴板:在可视模式下选择要复制的内容。输入 "+y 按回车
在可视模式下选择要复制的内容。
键入“+y
按回车
从系统的剪贴板粘贴一些东西:在 vim 中移动到要粘贴复制文本的位置。只需键入 "+P 粘贴在光标之前或 "+p 粘贴在光标之后。
在 vim 中移动到要粘贴复制文本的位置。
只需键入 "+P 粘贴在光标之前或 "+p 粘贴在光标之后。
"+P 粘贴在光标前 OR
"+p 在光标后粘贴。
要了解其工作原理的更多信息:Copy and Paste to/from Vim from/to Other Programs!
如果您在 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 中复制该行并将其粘贴到系统范围内。
如果你有它,试着从你的 vimrc 中删除它: set mouse=a
它与粘贴功能相混淆。
这些组合键适用于任何操作系统。
使用鼠标选择目标文本,并参考键序列进行复制、剪切和粘贴。
复制:Ctrl + Del
粘贴:Shift + 插入
剪切:Shift + Del
粘贴:Shift + 插入
在设置 :set clipboard=unnamed
之上,如果您在 Mac OS X 10.9 上的 Terminal.app 上使用 vim,您应该使用 mvim -v
,您可以通过 brew install macvim
获得。默认 vim 不支持剪贴板选项。
基于@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 动词中启发的键:分别为 <C-y>
、<C-d>
和 <C-p>
。这些只会覆盖一个默认映射:
i_CTRL-P:向后搜索关键字以完成
如果您想更改 vimrc 等,其他解决方案也很好......但是我想要一种简单的方法来从 vim 复制到我的系统键盘。这就是我想出的。
使用可视模式选择要复制的文本 v
按:(它会自动展开显示:'<,'>)
键入 y * 或 y +(取决于您的系统)将所选文本拉到系统剪贴板
由于 vim 8 右键单击默认启用可视模式。这可以防止“正常”复制和粘贴(称之为“设计缺陷”https://github.com/vim/vim/issues/1326)。通过执行以下操作修复它:
echo "set mouse-=a" >> ~/.vimrc
。
退出并重新启动 vim。
Shift + 右键单击 -> 粘贴
为我做了伎俩
可能还值得一提的是,在使用 Vim 的 OSX 上,您可以用鼠标选择文本,Cmd-C 复制到 OSX 系统剪贴板,复制的文本将在 Vim 之外的剪贴板中可用。
换句话说,OSX 将其视为普通窗口,这就是备受诟病的 Apple“命令”按钮派上用场的地方。
B-30
有两种简单的方法可以做到这一点。使您的文件处于插入模式,然后 1)按鼠标中的按钮(滚轮),或 2)Ctrl + Shift + V
进入vim窗口后,按I进入插入模式。然后将光标移动到所需位置并同时按 Ctrl + Insert 按钮从剪贴板粘贴。
不定期副业成功案例分享
"*p
做什么?我是按 Shift-',然后是 Shift-8,然后是 p,等等?dd
为例。第一个d
进入运算符挂起模式,然后第二个d
完成命令并删除该行。但是,如果您键入dG
,则G
会将其删除到文件的末尾,而不是仅仅删除该行。寄存器使用相同的主体来允许各种命令使用它们。vim-gtk
软件包(至少在 Debian 下),才能获得使用+xterm_clipboard
编译的 vim。我花了 4000 万才发现这一点,而sudo apt-get install vim-gtk
只用了几秒钟。vim-gnome
也有效并启用了+xterm_clipboard
。