粘贴在插入模式?

Ami*_*hum 363 vim

是否可以在Vim中以插入模式粘贴?

小智 431

在插入模式下命中 CTRL-R {register}

例子:

  • CTRL-R * 将插入剪贴板的内容
  • CTRL-R " (未命名的寄存器)插入最后一个删除或猛拉.

要在vim的帮助类型中找到它 :h i_ctrl-r

  • `CTRL-R*`仅适用于GVIM或编译为与x交互的版本.输入`vim --version`并查找`+ xterm_clipboard`.如果你没有,你需要一个不同版本的vim.(http://vim.wikia.com/wiki/Accessing_the_system_clipboard) (15认同)
  • 是的,我最近才知道CTRL-R,它非常有用. (12认同)
  • 你实际上只需要`+ clipboard`,但是如果你有`+ xterm_clipboard`,那么无论如何都应该有.在某些操作系统上,`xterm_clipboard`不适用. (9认同)
  • @ kitsu.eb在X系统上,`*`寄存器可以用鼠标中键点击,而`+`是传统的复制/粘贴.http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt (5认同)

Jam*_*der 226

如果您不希望Vim在传入的粘贴文本中修改格式,您可能还需要考虑使用::set paste.这将阻止Vim重新标记您的代码.完成粘贴后,:set nopaste将恢复正常行为.

通过添加类似于set pastetoggle=<F2>.vimrc 的内容,也可以使用单个键切换模式.有关切换自动缩进的更多详细信息,请点击此处.

  • `:set nopaste`将禁用粘贴模式 (47认同)
  • `vim`命令末尾的`!`可以打开和关闭命令.这样你就不必输入`:set nopaste`而是可以向上滚动历史并再次运行相同的命令(`:set paste!`). (30认同)
  • @JamesSnyder一个更好的方法是`:设置粘贴!'可能在你的命令历史中设置粘贴非常接近,所以你只需按':',然后向上箭头并添加一个'!'. (24认同)
  • 只是好奇 - 什么是更好或不同的`:设置粘贴!`谢谢:) (6认同)
  • @blockloop您应该在粘贴时启用它,然后立即禁用它。 (3认同)

Jar*_*Par 122

不,不是直接的. 你可以做的是快速退出插入模式进行单个正常模式操作,Ctrl-O然后从那里粘贴,最后将你放回插入模式.

重点组合: Ctrl-O p

编辑:有趣.似乎有其他几个人列出的方式.

  • 这是记忆最快,最简单的方法. (4认同)
  • 绝对比 `esc + p + i` 快,而且比 `CTRL-R + "` 更容易输入 (3认同)
  • ctrl-r " 对我不起作用(终端中的 os x、vi)。 ctrl-o p 做了。 (2认同)

Zaz*_*Zaz 27

在插入模式下,您可以使用Ctrl-R {register},其中寄存器可以是:

  • + 对于剪贴板,
  • * 对于X剪贴板(X中最后选择的文本),
  • " 对于未命名的寄存器(最后删除或在Vim中猛拉),
  • 或许多其他人(见:h registers).

Ctrl-R {register} 插入文本,就像输入一样.

Ctrl-R Ctrl-O {register} 插入带有原始缩进的文本.

Ctrl-R Ctrl-P {register} 插入文本并自动缩进.

Ctrl-O可用于在返回插入模式之前运行任何正常模式命令,因此
Ctrl-O "+p也可以使用,例如.

有关更多信息,请查看文档 :h i_ctrl-r

  • 这个答案似乎是最全面的.非常清楚,在我看来,最有帮助的.它简明扼要地回答了OP的问题,然后回答了一些问题. (4认同)

cli*_*ime 26

您可以使用此选项从剪贴板粘贴Ctrlv:

set pastetoggle=<F10>
inoremap <C-v> <F10><C-r>+<F10>
Run Code Online (Sandbox Code Playgroud)

这用于将视觉选择放入剪贴板中Ctrlc:

vnoremap <C-c> "+y
Run Code Online (Sandbox Code Playgroud)

如果您还希望在正常模式下使用剪贴板进行经典vim yanking /粘贴(y/ p),这里有一个配置选项:

set clipboard=unnamedplus
Run Code Online (Sandbox Code Playgroud)

使用此配置,您可以例如在正常模式下首先猛拉然后以Ctrlv插入模式粘贴.此外,您可以粘贴来自不同vim实例和不同应用程序的文本.

另一种选择是:

set clipboard=unnamed
Run Code Online (Sandbox Code Playgroud)

然后你就可以在X环境中通过鼠标拖动选择一些东西,然后将其粘贴到vim中.但是(出于某种原因)你将无法y在Vim和shiftinsert其他地方猛拉某些东西(),这可能是非常有限的.

Vim关于此的文档:http://vim.wikia.com/wiki/Accessing_the_system_clipboard

对于从自定义寄存器粘贴,您可以按照其他答案:).这个答案主要是关于将Vim与系统剪贴板集成.


请注意,set clipboard=unnamedplusset clipboard=unnamed工作,你需要使用gvim的或vimx( vim-X11):那些被编译+xterm_clipboard.你可以选择将它放入你.bashrc的别名vimvimx:

if [ -e /usr/bin/vimx ]; then
    alias vim='/usr/bin/vimx'; # vim with +xterm_clipboard
fi
Run Code Online (Sandbox Code Playgroud)

您可以查看您的vim是否包含所+xterm_clipboard提供的信息vim --version.

  • 这正是我所寻找的.这也是唯一合理的答案.这就是人们期望事情发挥作用的方式.有谁知道为什么`:set paste`和拜占庭`<leader> <leader>*y`的默认行为甚至是可取的?不要过于忠诚,我真的很好奇这反映了什么是vim哲学,或者它只是一个历史的不幸. (7认同)

小智 19

如果将Vim设置为使用系统剪贴板(:set clipboard=unnamed),则可以使用Shift+ 粘贴在Vim中复制的任何文本Insert.Shift+ Insert只是一个OS范围的粘贴键组合(Ctrl+ Insert是相应的'副本').


lcl*_*ltj 17

您也可以使用鼠标中键来粘贴插入模式(仅限Linux).

  • 你说的这只老鼠是什么? (106认同)
  • 你说的这些非Linux操作系统是什么? (19认同)

rud*_*ph9 5

您可以-- INSERT (past) --通过以下方式进入

  • 键盘组合: y p

要么

  • :set paste并进入插入模式(:set nopaste禁用)

一旦进入-- INSERT (past) --模式,只需使用您的系统粘贴功能(例如CtrlShiftv在Linux上,Cmdv在Mac OS上).

当使用vim over ssh时,此策略非常有用.