与其他编辑器不同,vim 将复制的文本存储在自己的剪贴板中。因此,我很难从网页中复制一些文本并将其粘贴到当前的工作文件中。碰巧我必须打开 gedit 或手动输入。
我可以在系统的剪贴板上进行 vim 粘贴吗?
请注意,如果返回 0 ,则从系统剪贴板复制/粘贴将不起作用:echo has('clipboard')
。在这种情况下,vim 没有与该+clipboard
功能一起编译,您必须安装不同的版本或重新编译它。一些 linux 发行版默认提供最小的 vim 安装,但如果你安装vim-gtk
orvim-gtk3
包,你仍然可以获得额外的功能。
和寄存器用于系统的剪贴板 ( "*
) 。根据您的系统,他们可能会做不同的事情。例如,在 OSX 或 Windows 等不使用 X11 的系统上,该寄存器用于读取和写入系统剪贴板。在 X11 系统上,两个寄存器都可以使用。有关更多详细信息,请参阅,但基本上类似于 X11 的选择(通常复制您使用鼠标选择的内容并使用鼠标中键粘贴),并且类似于 X11 的选择(正确的剪贴板)。"+
:help registers
"*
:help x11-selection
"*
_PRIMARY_
"+
_CLIPBOARD_
如果这一切都超出了您的想象,请尝试使用"*yy
或"+yy
将一行复制到系统的剪贴板。假设您有适当的编译选项,一个或另一个应该可以工作。
您可能希望将其重新映射为对您更方便的东西。例如,您可以输入vnoremap <C-c> "*y
您的~/.vimrc
,以便您可以直观地选择并按Ctrl+c拉到系统的剪贴板。
您可能还想查看 中'clipboard'
描述的选项:help cb
。在这种情况下,您可以: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
以避免弄乱缩进。
我相信这个问题应该得到一个更客观、更形象的答案:
进入粘贴模式
离开粘贴模式
您粘贴了文本,您可以再次输入。
对于我来说,该配置适用于复制和粘贴
" copy and paste
vmap <C-c> "+yi
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa
在我的 Linux 系统上,+
和*
寄存器映射到 X11 选择,可以用鼠标中键粘贴。使用:set clipboard=unnamed
和:set clipboard=unnamedplus
时,寄存器映射到剪贴板,可以用 CTRL-V 粘贴。
细节似乎在某种程度上取决于配置和系统,因此您的里程肯定会有所不同。不过,它绝对应该让你指向正确的方向。
这将是您在 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 选项很少被应用程序使用。
没有 +clipboard 所以我想出了这个使用 xsel 的替代解决方案:
添加到你的 ~/.vimrc:
vnoremap <C-C> :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
which 将我的桌面剪贴板粘贴到 Vim 的缓冲区中。Ctrl-C
已经在努力从 Vim 复制到桌面的剪贴板。
复制到操作系统剪贴板
在可视模式下选择文本,按"*y
从操作系统剪贴板粘贴
按"*p
给 Vim 安装不支持*
和+
寄存器的人的快速说明。无需下载新的 Vim 安装即可从剪贴板粘贴。这是另一种方法:
安装parcellite
(内存占用少的剪贴板管理器);
在您的.vimrc
文件中,添加以下内容:
command Clip r !parcellite -c
重启vim。
现在,当您:Clip
作为ex
命令输入时,剪贴板的内容将被粘贴到光标处。您还可以将新命令映射到功能键,以便能够一键完成此操作。
最简单的解决方案,也适用于不同的 Linux 机器ssh
:
检查 vim 是否支持 X-11 剪贴板: vim --version | grep clipboard
. 如果它报告回来-clipboard
,-xterm_clipboard
你应该安装vim-gtk
或者vim-gnome
(在arch linux上的gvim)
将以下行添加到您的.vimrc
:
set clipboard=unnamedplus set paste
ssh -Y machine
现在,复制和粘贴应该在单个机器上完全按照预期工作,并且只使用y
for yank 和p
for paste 跨不同机器。注意.vimrc
在您要使用此功能的所有机器上进行修改。
如果您先使用鼠标,请执行
:set paste
然后right click mouse
,缓冲区中的内容将被粘贴
这对我有用:Ctrl++ShiftV
vim
我在iTerm2
作为主要开发环境运行的 2017 年中期 Macbook Pro 上遇到了这个问题。
正如其他答案所暗示的那样,我运行vim --version
并注意到它返回-clipboard
,这意味着vim
我的机器附带的版本尚未使用剪贴板选项进行编译。
for的homebrew
包vim
似乎可以使用该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 <C-v> <C-o>"+p
插入模式如果您真的想覆盖逐块视觉模式(他不推荐,因为视觉模式很好),您可以
map <C-v> "+p
在 Linux 或 Mac 上使用 Vim 8+,您现在可以简单地使用操作系统的本机粘贴(ctrl+shift+V
在 Linux 上,cmd+V
在 Mac 上)。不要按i
插入模式。
它将粘贴操作系统剪贴板的内容,保留空格和制表符而不添加自动缩进。它相当于旧的:set paste
, i
, ctrl+shift+V
, esc
,:set nopaste
方法。
您甚至不再需要安装+clipboard
或+xterm_clipboard
vim 功能。此功能称为“括号粘贴”。有关更多详细信息,请参阅将文本粘贴到 vim 时关闭自动缩进
如果您在 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
现在您可以在 vim 中复制该行yy
并将其粘贴到系统范围内。
如果你有它,试着从你的 vimrc 中删除它: set mouse=a
它与粘贴功能相混淆。
复制到系统剪贴板:
"+y
粘贴一些表单系统的剪贴板:
"+P
在光标之前粘贴或"+p
在光标后粘贴。要了解更多它是如何工作的:从/到其他程序复制和粘贴到/从 Vim!
除了设置之外,如果您在 Mac OS X 10.9 上的 Terminal.app 上使用 vim :set clipboard=unnamed
,您应该使用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。
可能还值得一提的是,在使用 Vim 的 OSX 上,您可以用鼠标选择文本,Cmd-C 复制到 OSX 系统剪贴板,复制的文本将在 Vim 之外的剪贴板中可用。
换句话说,OSX 将其视为普通窗口,这就是备受诟病的 Apple“命令”按钮派上用场的地方。
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 映射:
作为一种替代方法,可以使用“yank”、“delete”和“put”Vim 动词:和分别启发<C-y>
的<C-d>
键<C-p>
。这些只会覆盖一个默认映射:
i_CTRL-P
:向后搜索关键字以完成您真正需要的是EasyClip。它会做到这一点,还有更多……
进入vim窗口后,按I进入插入模式。然后将光标移动到所需位置并同时按Ctrl+Insert按钮从剪贴板粘贴。
这些组合键适用于任何操作系统。
使用鼠标选择目标文本,并参考键序列进行复制、剪切和粘贴。
当我使用未与 Gnome 集成的 Debian vim 时(vim --version | grep clip # 显示不支持剪贴板),我可以在按住 Shift 键并用鼠标选择文本后复制到剪贴板,就像使用任何其他诅咒程序。正如我从@Conner 的评论中得出的那样,当它感应到我的 Shift 按下时,它是终端(在我的例子中是 gnome-terminal)关闭它的鼠标事件报告。我猜基于 curses 的程序可以在向终端发送某个 Escape 序列后接收鼠标事件。
如果您在 Windows 上并且想要使用粘贴系统剪贴板的内容,请p
键入此命令。
:set clipboard = unnamed
这解决了我的问题。
对于某些国际键盘,您可能需要按"+Space才能获得"
.
因此,在这种情况下,您将不得不按下"Space+y或"Space*y复制。
和"Space+p或" Space*p粘贴。
我使用了 NM Pennypacker 的答案,并通过自制软件为 2011 年初的 MacBook Pro 安装了 vim:
brew install vim
现在我还可以使用 "* 寄存器在 vim 中复制和粘贴文本。我什至不必更改 ~/.vimrc 文件或 $PATH 中的某些内容。Homebrew 在 /usr/local/bin 中添加了符号链接,例如vim -> ../Cellar/vim/8.1.2350/bin/vim。
以前可行的替代方法是在 vim 中复制一些文本行,方法是用鼠标标记它并在 mac 上使用复制和粘贴 (cmd + c, cmd + v)。此选项仅在您要复制和粘贴的文本大小小于 vim 的窗口大小时才有效。如果你想通过标记整个窗口或使用 cmd + a 来复制 vim 中的所有文本,这将复制控制台的其他部分,在启动 vim 之前编写,这很烦人。
所以,我很高兴找到了使用剪贴板寄存器的新方法。