如何在vim中有效撤消自动完成

dav*_*uda 6 vim autocomplete vim-plugin

现在我正在使用vim中的自动完成功能,我已经选择了supertab来处理我的完成情况.虽然它的运行非常顺利(我认为)正如它的设计,我想知道如何改变一些东西.

首先,我在Ubuntu 12.04LTS上运行7.3.429

set completeopt=menuone,preview,longest
Run Code Online (Sandbox Code Playgroud)

所以我有supertab的bash类型自动完成,默认完成.

假设我的文件中有以下内容:

aaabbbcccddd
aaabbccddeef
aaabbcddeeff
Run Code Online (Sandbox Code Playgroud)

如果我输入aa并点击Tab,则vim意识到这aaabb是匹配中最长的常见字符串,因此它插入aaabb并显示包含三个选项的菜单.如果我确实想要其中一个选项,那么一切都很好.但也许我真的想要aaaaazzzzz,但没有意识到我还没有输入它.

是否有一个很好的方式来对vim说:"哦,我很抱歉!毕竟我并不是要完成任务!请假装我没有."

现在,对我来说明显的选择是:

  1. 点击TabShift+ Tab足够的时间回到我的初始.但是如果有很多相似的词,特别是不同的长度,这很烦人.
  2. 无论如何需要多次支持退格键,或者其他一些天真的删除.但这些肯定是不必要的关键.
  3. 点击Esc+ u以获得撤消,但这会撤消我的全部信息(如果我快速键入,则会更多).这是完全不可接受的.然后,我需要重新进入插入模式并重新输入.毛.
  4. 点击Ctrl+ U撤消而不离开插入模式.但这也有过多的消除方式.
  5. Ctrl+ W删除最后一个单词.虽然我在不退出插入模式的情况下执行此操作,但仍需要重新键入.这是迄今为止我发现的最好的.

如果我没有longest启用,那么我可以使用Ctrl+ E,它退出菜单而不插入任何其他内容.但是,由于最长时间打开,它会停止自动完成,但会保留输入的最长公共匹配.

当然必须有更好的方法来做到这一点.

Pet*_*ker 2

在 vim 中有两种本地方法可以做到这一点。如果您知道该项目不在完成菜单中,则可以使用 的正确方法<c-y><c-y>接受当前匹配,如果您没有移动,但任何完成都会将您返回到仅插入的文本。(第二种方式)但是,如果您确实浏览了完成菜单,您可以继续移动,直到回到原始文本。

不过,我认为简单地接受最长的匹配并编辑该单词并不太难。您还可以通过将<c-g>u撤消块添加到<tab>映射中来分解撤消块。尽管这可能会比你想要的更打破历史。