使用 vim 撤销 imap 命令所写入的字符(删除)。

5
在vim中,我能否删除由i(no)remap或iab编写的文本块?例如,假设我在我的.vimrc文件中有inoremap xx \hat{x},我想用一两个按键删除\hat{x}(但不是^w或dB..我可能有两个连续的iabs仅由文本组成,因此如果cdcdcd是“cc”的iab,则需要能够在中间剪切abababcdcdcd)。有什么想法吗?
2个回答

2

最终的清洁解决方案

inoremap xx ^Gu\hat{x}^Gu

(那里是 C-g

不再出现奇怪的效果。您甚至可以选择是否在两端隔离撤消项,或者只在开始隔离(如果您不介意帽字符后面的内容也被一起撤消,则留下尾部的 ^Gu

现在我使用的救援信息终于是微不足道的:

:he undo|/break/;+3p

输出:

要做相反的操作,将一个更改分成两个撤消块,在插入模式下使用CTRL-G u。如果您希望一个插入命令可以分部撤消,例如每个句子,这很有用。|i_CTRL-G_u|


抱歉,这会产生更有趣的结果... 相应的,虽然它似乎正常工作,如果我输入xx,然后yy,然后<Esc>u,再输入xx,它重新显示xx yy的结果,而不仅仅是xx! !!! - sfranky
哎呀,感谢反馈。就像我之前担心的那样(“可能会对分支历史产生奇怪的影响”),只不过更糟糕:一个单独的分支就足以使其表现异常。我会看看能否在接下来的10分钟内解决这个问题 :) - sehe
你不会相信,但我做到了!这真的很简单,没有更多的hackery(只是更多的RTFM-<shame/>)。好的,19分钟,但我在电话中被打断了。请自行验证后随意接受此答案 :) - sehe
太好了!我已经放弃了不需要重新调整所有我的imap的解决方案,所以这确实是下一个最好的选择!点赞! - sfranky
我喜欢学习那些我之前不知道的 Vim 技巧(大多数情况下),你呢? - sehe

1

由于撤销操作会撤销最后一次插入,因此我经常在我的映射开头放置一个<Esc>a

例如:

inoremap xx <Esc>a\hat{x}

让你离开并返回插入模式,以便撤销可以正常工作。如果您输错了,您可以正确地撤消。

我知道这可能很丑陋和毫无意义,但它确实有效。我很想知道是否有更好的解决方案来“刷新”撤消。


谢谢回答。我希望能够在不更改当前的 IMAP(我有几个!)的情况下解决它。我会暂时保持开放状态,以防有一个让它们保持不变并且满足我的要求的答案! - sfranky
顺便说一句,这个不起作用!我仍然得到相同的结果!也许我的vimrc有问题? - sfranky
啊哈,它没有……我会更新我的答案,并提供一个可行的“hack”解决方案! - sehe
@sfranky,这很奇怪。在这里它完美地工作。映射只是一个按键,所以如果您输入一些内容,按 <Esc>a,插入映射,再次按 <Esc>,然后按 u 撤消,那么映射就被删除了,对吧? - sidyll
当我像那样做时,是的,但是当我在映射中放置<Esc>a时,它会继续删除整个编辑块。 - sfranky
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接