【问题标题】:internal code-completion in vimvim 内部代码补全
【发布时间】:2011-12-08 23:28:36
【问题描述】:

vim 帮助文件中没有列出一个完成类型(特别是:insert.txt),但我本能地觉得经常需要它。假设我的文件中有“Awesome”和“SuperCrazyAwesome”这两个词。我找到了一个 Awesome 的实例,应该是 SuperCrazyAwesome,所以我跳到单词的开头,进入插入模式,然后必须输入“SuperCrazy”。

我觉得我应该能够键入“S”,创建“SCrazy”,然后只需点击一个或两个完成热键,让它找到光标左边的内容(“S”),右边的内容(“Crazy”),对文件中的所有单词进行正则表达式(“/S\w*Crazy/”),并为我提供一个选择的完成弹出菜单,或者如果只有一个匹配项,则只进行替换。

我想为此使用实际的完成系统。存在一个使用函数的“用户定义”完成,并且在从给定列表中替换的帮助中有一个很好的例子。但是,我似乎无法找到实现这一目标所需的许多细节,包括:

  1. 如何从 vim 函数中获取文件中所有单词的列表?
  2. 我可以像 vim 的完整一样列出所有缓冲区中的单词(带有文件名)吗?
  3. 如何在插入模式下获取光标之前/之后单词中的文本?
  4. 补全是否可以替换整个单词,而不仅仅是光标?

我已经在这里呆了几个小时了。我一直在死胡同,比如this one,它向我介绍了 \%# 以匹配光标位置,这似乎对我不起作用。例如,搜索 \w*\%# 只返回我所在单词的第一个字符,而不管我在其中的哪个位置。 \%# 似乎没有锚定。

【问题讨论】:

  • 不严格相关,但您可能会从this 答案中得到一些提示。有一些示例函数可以从当前文件生成单词列表,还有一个自定义完成函数。我将在今天晚些时候尝试发布答案。
  • 您的链接看起来很有趣且数据丰富。我会挖掘它。感谢您的帮助。

标签: regex vim code-completion


【解决方案1】:

虽然它过去并不完全遵循您想要的方法,但我已经写了https://github.com/mjbrownie/swapit,如果您正在寻找相关的关键字,它可能会执行您的任务。如果你有数百个匹配项,它会在这种情况下崩溃。

它主要用于 2-10 个可能的排序匹配。

你会定义一个列表

:SwapList awesomes Awesome MoreAwesome SuperCrazyAwesomefullyCompletelyAwesome UnbelievablyAwesome

并使用递增或递减键 (c+a) (c+x) 在匹配项中移动

我在 vim.org 和 github 上还知道一些其他循环类型的插件,例如交换词。

这里的好处是您不必使用正则表达式将单词组合在一起。

【讨论】:

  • 感谢您的链接,迈克尔。我得仔细看看。你见过vim自带的词库补全的东西吗?我今天在搜索以解决我列出的问题时遇到了它。它可以让你定义相关的词,我认为是在一个词库文件中,然后用通常的 / 热键匹配它们。
  • 我有但没有真正想过将它用于代码库。好主意。您可能仍然会发现 swapit 对于临时重构很有用,例如您正在浏览设置文件并将 SomeKeyword 替换为 AnotherKeyword 以查看一些但不是全部的关键字。您只需设置列表 go /Keyword 并在需要时 go (c+a)...n...n.n..n.(c+a) 无需将列表添加到文件中。
  • 听起来肯定有帮助。谢谢!
【解决方案2】:

几年前,我在使用 3rd 方库时写过类似的东西,在每个组件的每个函数中都有相当长的 CamelCasePrefixes。但它是在 Git Hub 时代之前,我认为它是一颗失落的宝石,但搜索引擎说我不是一个完整的混蛋并将其发布到 Vim wiki。

这里是:http://vim.wikia.com/wiki/Custom_keyword_completion

别问我“MKw”是什么意思。不知道。

这需要根据您的需要进行一些调整,因为它只查找光标所在的单词,但想法就在那里。它仅适用于当前缓冲区。遍历所有缓冲区会很慢,因为它没有创建任何索引。出于这些目的,我会使用外部 grep。

【讨论】:

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