如何仅撤消Vim中的粘贴文本?


10

TL; DR; 版本-如何撤消从OS复制缓冲区粘贴的文本,而不撤消自从进入插入模式以来键入的其他文本?

较长的说明:

  1. 在OS复制缓冲区中放入一些内容(例如突出显示一些文本并Command-c在Mac上执行)
  2. 在vim(i)中进入插入模式
  3. 输入一些内容(例如asdf
  4. 在不退出插入模式的情况下,将复制缓冲区中的内容粘贴到vim中(Command-v在Mac上)
  5. 击中 escape
  6. 尝试撤消粘贴(u

从上次进入插入模式起,它会撤消所有操作。换句话说,它清除了asdf我粘贴的所有文字。

如何刚刚撤消粘贴文本?我是否必须始终退出插入模式并返回,然后才能粘贴文本才能撤消粘贴的文本?

Answers:


4

一种方法是显式退出并在粘贴之前返回插入模式。如果扩展粘贴命令,则还可以在粘贴之前自动设置撤消点

" Any text fragment pasted in insert mode should be undone separately, without
" destroying what was typed before.
inoremap <C-R> <C-G>u<C-R>

上面是针对内置i_CTRL-R命令的。我不知道如何Command-v在MacVim中实现,但是<C-G>u:imap命令前添加应该达到相同的效果。


1
就像魅力一样,谢谢!无论如何,我可能应该坚持使用标准的vim方法进行粘贴。
Javid Jamae 2014年

只需添加以下内容即可:(:h i_CTRL-G_u即在插入模式下“打破撤消顺序,开始新更改”)。
toraritte

2

在MacVim中,您需要取消映射Edit > Paste菜单项才能覆盖快捷方式,然后可以D-v在每种模式下将Cmd-V(以MacVim的说法)重新映射为适当的命令。我将其添加到我的计算机上~/.gvimrc,现在一切正常:

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

<C-g>u仅在插入模式来解决撤消历史是必要的; 的noremapcnoremap是简单地恢复正常和命令模式的默认粘贴行为。

感谢Ingo Karkat在这里为我指明了正确的方向。


1

实际上,解决方案是您必须先进入命令模式(例如Esc)并重新进入插入模式,但是它仅在我手动键入时才有效,但如果在中进行测试,似乎“随机地”停止工作~/.vimrc。Google根本没有帮助。

我花了很多时间尝试解决此问题,但我只是想出原因:

不要将粘贴键映射到终端现有的粘贴键

例如,Ctrl+Shift+V将在我的Konsole终端粘贴,但如果我给你这个关键<C-S-v>~/.vimrc,“撤消仅供一次性粘贴而不是多个粘贴”,将无法正常工作。

就我而言,我必须使用<C-v>代替<C-S-v>

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

您的情况可能有所不同,但要点是相同的:不要分配相同的粘贴键与现有的终端仿真器键冲突。

我将终端粘贴键设置为Ctrl+V,现在100%证明了这一结论,<C-v>但现在停止<C-S-v>工作了。

另请注意,vim过于敏感和奇怪。我发现必须使用i,然后手动使用2个向右键才能使其在正确的光标位置上工作,这意味着我也必须i同时输入2个向右键~/.vimrc。您的情况可能有所不同,但要点是相同的,请确保〜/ .vimrc中的键和顺序与您手动键入的键100%匹配。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.