【问题标题】:Completion before and after word vimword vim 前后补全
【发布时间】:2014-11-11 14:43:48
【问题描述】:

我添加了这样一个词的字典:

foo.bar
this.is.a.test

我做了:set iskeyword+=. 完成工作,尽管有点:

当我输入fo<TAB> --> foo.bar

但我也希望有这样的完成:

test<TAB> --> this.is.a.test

我的意思是,我不会总是输入单词的开头。

希望我清楚

提前致谢

【问题讨论】:

  • 只是因为我使用了qooxdoo框架(api.qooxdoo.org),而且是每个类的语法。
  • 啊,我明白我完全误解了你对this 关键字的使用:-) 完全忘记了包名......

标签: vim completion


【解决方案1】:

<c-p>/<c-n> 之后使用插入模式的<c-x><c-p>,您可以完成前一个完成之后的单词。这假设单词一起出现在前面。这意味着您不需要将. 添加到'iskeyword'(最好不要!)。

至于通过@Ingo Karkat 建议的自定义完成可能最好通过单词结尾完成。但是,我个人还没有遇到过这样的完成需求。

如何使用<c-x><c-p>关注<c-p>/<c-n>

  • 输入第一个单词或其中的一部分。例如示例中的test
  • 点击<c-p>开始补全并打开补全菜单
  • 通过<c-n><c-p>(可选)找到正确的补全
  • 点击<c-x><c-p> 完成下一个单词,例如示例中的.is
  • 通过<c-n><c-p>(可选)找到正确的补全
  • 根据需要重复 <c-x><c-p><c-p>/<c-n> 步骤

所以一起:test<c-p><c-x><c-p><c-x><c-p><c-x><c-p> 将产生this.is.a.test

结论

使用<c-x><c-p> 很难解释,但尝试几次后更容易理解。相信我,这是值得的。你也可以用整行完成来做类似的技巧,即<c-x><c-l>。帮自己一个忙,阅读所有:h ins-completion,你会做得更好。

除了使用<tab> 来完成

Vim 提供了多种补全选项。例如,通过<c-x><c-l> 完成整行,标签:<c-x><c-]>,文件名:<c-x><c-f> 等等。通常使用巧妙的<tab> 映射或像SuperTab 之类的插件来完成会隐藏这些其他完成模式,让它们感觉不太熟悉。注意:SuperTab 因引起冲突或不良行为而臭名昭著。

如需更多帮助,请参阅:

:h i_ctrl-x_ctrl-p
:h ins-completion
:h 'complete'
:h 'completeopt'

【讨论】:

  • 我不认为<C-x><C-p> 像你描述的那样工作。 “上一个”仅用于搜索方向(即候选的排序),重复它仍然完成 next 匹配。它只考虑当前缓冲区中的单词(不是字典)。
  • @IngoKarkat 你是对的,这不适用于字典,只能使用当前缓冲区。但是,如果您确实在当前缓冲区中已经有this.is.a.test,那么test<c-p><c-x><c-p><c-x><c-p><c-x><c-p> 可以产生this.is.a.test(也假设set isk-=.)。我相信这是一个合理的原生解决方案
  • @IngoKarkat:抱歉,在<c-p> 之后使用<c-x><c-p> 与其他缓冲区一起工作,而不仅仅是当前缓冲区。刚试了一下。很抱歉造成混乱
  • 我用的是isk+=。因为我希望 this.is.a.test 被视为一个单词而不是四个单词。
【解决方案2】:

内置补全始终提供以补全基础开始的匹配项。但是,您可以编写实现不同策略的自定义完成。

如果您的字典是加载的缓冲区(不是内置字典完成:help i_CTRL-X_CTRL-K),我的CompleteHelper plugin 可以更轻松地实现匹配项的提取。有了它,BidiComplete plugin 提供了一些相关的东西:当光标位于 |testleft 时,this.is.a.test 的完成。 (我还有一个 MiddleEndComplete 插件正在开发中,可能接近你想要的。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多