在vim中,我经常在从系统剪贴板中搞砸了一些搞砸后,最终撤消了比我想要的更多的内容。还有更好的方法吗?
重现:
<!DOCTYPE html>
<html lang="en" ng-app="app">
<head>
<meta content="UTF-8">
<title>live data example</title>
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.js"></script>
<script type="text/javascript" src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
<ul>
<li ng-repeat="item in arr">{{item}}</li>
</ul>
</body>
粘贴是一团糟,因为我没有Open iTerm # or terminal
vi # open vim
i # enter insert mode
type some stuff
Cmd-V # paste the contents of the OS X clipboard
。所以
:set paste
但这会取消我的输入以及我的粘贴。
我可以使用不同的撤消吗?除了在粘贴前记住Esc # enter command mode
u # undo
还有更好的方法可以做到这一点吗?
答案 0 :(得分:4)
这不是您正在寻找的答案,但您真的应该停止使用vim作为非模态编辑器。如果要粘贴,则返回正常模式并使用vim的粘贴命令。
假设你有一个带剪贴板访问权限的vim版本,这应该可以做到catch
。您还可以通过将未命名的寄存器设置为"+p
(或+
)寄存器来实现此目的,这样从剪贴板粘贴变为简单的*
。
以下问题包含所有这些信息How to make vim paste from (and copy to) system's clipboard?。
答案 1 :(得分:1)
我不确定在事后您可以做些什么,但一种解决方案是在粘贴之前在插入模式下点击Ctrl-G
u
。这会将撤消块分成两个单独的块 - 因此粘贴将被记住为单独的可撤消操作。
如果您必须记住这样做,那么您也可以使用:set paste
代替 - 但从好的方面来说,它的击键次数更少,而且您不必进入命令模式第一。
答案 2 :(得分:1)
看看这个plugin,当您使用 Cmd-V (或 Ctrl-V )时,它可以自动运行:set paste!
粘贴一些文字。完成后请保留粘贴模式。
答案 3 :(得分:1)
在插入模式下粘贴之前,以下映射会创建一个额外的撤消点(通过:help i_CTRL-G_u
)。这样,您可以单独撤消粘贴。
inoremap <C-r> <C-g>u<C-r>
inoremap <C-v> <C-g>u<C-v>
答案 4 :(得分:0)
实际上解决方案是你必须首先进入命令模式(例如 Esc )并重新进入插入模式,但只有在我手动输入但它似乎“随机”停止工作时它才有效如果我在~/.vimrc
测试它。谷歌根本没有帮助。
我花了很多时间尝试解决这个问题,我只是想出了我的理由:
请勿将粘贴密钥与终端现有粘贴密钥相同
e.g。 Ctrl + Shift + V 将粘贴到我的Konsole终端,但是如果我在<C-S-v>
中分配此密钥~/.vimrc
,则“仅撤消单个粘贴而不是多个粘贴”将不工作。
就我而言,我必须使用<C-v>
代替<C-S-v>
:
inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>
您的情况可能有所不同,但重点是:不要将相同的粘贴密钥与现有的终端仿真器密钥冲突。
我已经100%通过将终端粘贴密钥设置为 Ctrl + V 来证明了这一结论,现在<C-v>
停止工作,但<C-S-v>
正在工作。强>
另请注意,vim过于敏感和奇怪。我发现我必须手动使用i
然后使用2个右键使其在正确的光标位置工作,这意味着我必须在i
中放置~/.vimrc
和2个右键太。您的情况可能有所不同,但重点是相同的,确保〜/ .vimrc中的键+顺序100%与您手动输入的内容匹配。