如何获得模糊代码完成


27

在Visual Studio中使用ReSharper时,可以使用模糊匹配而不是前缀匹配来自动完成符号。例如,如果我在找一个叫功能DoSomethingAmazing我可以写DoSoAm,它会尝试扩大我的查询匹配所有的符号DoSoAm在他们的名字的地方。

另一个示例可以在下面的gif中找到。您会看到几种扩展,其中非前缀字符串被扩展为正确的符号。(忽略片段扩展,因为在此问题中我仅关注模糊匹配)。一张gif图片,显示了实际操作中模糊匹配的几个示例

在Vim的YouCompleteMe插件中可以看到另一个示例: gif显示在vim中进行动作的模糊匹配的更多示例

自动完成公司模式似乎都具有前缀匹配,但是我找不到启用模糊匹配的方法。

理想情况下,该解决方案将与语言无关,并适用于我使用的任何符号完成包,但我也对特定于语言的解决方案感兴趣。我看过Helm,但还没有找到一种将其应用于代码完成的方法。

我考虑过其他选择,例如具有使用Helm缓冲区激活符号完成的键绑定,但我希望有一种使用弹出式完成来完成此操作的方法。

我也愿意对每种语言进行手动配置,因为某些语言用破折号分隔符号,而另一些语言则使用下划线或破折号,我认为这会影响匹配方式。


Answers:


19

Emacs的内置完成功能提供了类似的模糊匹配(默认情况下,它用于“ do-so-am”而不是“ DoSoAm”),并且IIUC的公司模式的最新版本至少在某些情况下会使用此功能。

例如,如果你打开,如果你键入一个elisp的缓存使用Emacs-24.4和最新的公司模式,(wi-sy公司会弹出一个菜单完成放映window-systemwindow-system-for-displaywith-syntax-table


2
有了Emacs 24.4 company-mode支持completion-styles此文章为尝试提供了一种可能的设置。
wasamasa 2014年

安装24.4之后,我发现这正是我想要的。不幸的是,它似乎是特定于语言的,需要更改公司后端才能使其适用于其他语言。但是,在答案之外,这是我找到的最接近的答案,并希望随着时间的推移,它将应用于更多的语言。谢谢!
杰克·伍兹

company-ycmd是另一个支持模糊补全的后端。
德米特里2014年

9

使用company-mode,您可以C-s用来搜索显示的可用候选者。搜索查询显示在modeline中(我知道这并不容易发现。我在这里提出了问题)。

如果要使用Helm完成,请考虑使用helm-companyac-helm。没有尝试过ac-helm,但是有了helm-company,您可以将其直接绑定到键上,以替换的标准接口company-complete


这接近我想要的。我希望无需调用按键就可以完成操作,但是我发现将它与前缀匹配结合使用是一个合适的选择。谢谢!
杰克·伍兹

如果您使用company-modeUI,则可以按C-scompany提供给您的可用候选列表中搜索候选。
Tu Do

是的,我理解这一点,就像我在上面的评论中所说的那样,这与我一直在寻找的东西很接近。理想的解决方案(对我而言)不需要Cs,并且在键入时会在弹出窗口中内联搜索候选对象。但是Cs方法肯定很有趣,我打算将其集成到我的工作流程中。
杰克·伍兹

使用公司时,我发现C-M-s比更好C-s。使用meta时,它将过滤候选对象,而不仅仅是搜索。
保姆2014年

@nanny很高兴知道这一点。
Tu Do

5

如前面的评论中所述,ycmd支持模糊匹配。您可以通过来使用它company-ycmd。正确配置后,您可以无缝体验到特定于语言的完成以及基于标识符的简单完成。


很高兴在这里显示“正确”的含义。
Jason Hu

2

有几种软件包可以提供一种或另一种的模糊补全。我想像Helm这样(因为您提到了它)。

如果您使用库Icicles,则可以在几种模糊完成方法中(即时)进行选择-比我在其他地方看到的更多选择。(我自己不是特别喜欢模糊补全,但是我提供了。)

冰柱补全(如果选择了模糊补全,则采用模糊补全)几乎适用于所有地方,但是并没有很多冰柱特定的代码完成功能。Icicles文档的这一页谈到了这种缓冲文本补全。


对于 Icicles使用Stefan (wi-sy在Emacs Lisp模式下完成的示例:

  1. 使用Icicles vanilla完成功能(Emacs提供的功能,尊重completion-styles),您将获得Stefan提到的相同符号。

  2. 使用Icicles Swank模糊符号完成(来自库el-swank-fuzzy.el)作为当前的TAB补全方法,您将获得以下完成候选对象:

    窗口系统                
    与语法表
    显示窗口系统
    小部件编码系统动作
    小部件符号提示内部
    小部件编码系统提示值
    带有swfy结构
    小部件指定文档
    swfy超时
    小部件指定字段
    小部件指定活动
    小部件指定按钮
    小部件指定插入
    小部件指定样本
    小部件指定秘密
    小部件指定无效
    窗户安全收缩p
    小部件类型复制
    调整窗口大小
    窗口-垂直调整根窗口的大小
    橱窗展示桌
    窗口-显示缓冲区
    窗口-调整大小应用p
    窗口调整大小总计
    widgetp-display-Completions
    窗口重新显示结束触发
    显示缓冲区窗口
    小部件可见性值创建
    widget-emacs-library-link-action
    小部件可编辑列表条目创建
    widget-emacs-注释链接动作

前三名候选人再次是斯特凡提到的候选人。

  1. 对于普通的模糊匹配补全(库fuzzy-match.el),唯一的候选者是with-syntax-table

  2. 使用Icicles 散点模糊全,您可以获得Swank模糊补全提供的所有候选项,以及以下内容:

    ange-ftp等待不忙
    指向带有符号链接的目录
    自动选择窗口设置功能
    ediff使全屏显示
    ediff切换全屏显示
    ediff窗口显示-p
    ediff窗口可以显示
    带语法的ediff表
    查找新的缓冲区文件编码系统
    gnus框架或窗口显示名称
    帮助窗口显示消息
    冰柱选择用于缓冲区显示的窗口
    带有编码系统的还原缓冲区
    设置W32系统编码系统
    设置窗口显示表
    设置窗口重新显示结束触发
    退出时写Shell的历史记录
    明智地拆分窗口
    tree-widget--查找子目录
    w32查找文件未找到设置缓冲区文件编码系统
    w32初始化窗口系统
  1. 使用Icicles Levenshtein(1)模糊子字符串完成(Levenshtein距离为1),您将仅获得以下完成:
    帮助跟随符号
    消息检查新闻语法
    w32初始化窗口系统窗口系统
    显示窗口系统
  1. Levenshtein距离为2而不是1,则有300多个完成候选人。

  2. 严格的Levenshtein(1或2)在完成有没有候选。同样,对于冰柱 Jaro-Winkler模糊完成


1
我同意模糊完成可能存在一些API重叠,但是代码完成通常需要特定于模式的编译或运行时检查。正如您所说的那样,Icicles在代码完成功能方面提供的很少,因此似乎与手头的问题无关。
dgtized 2014年

@dgtized:好吧,我不同意。你试过了completion.el吗?(同样,dabbrev并且hippie-expand-这3个都包含在GNU Emacs中。)这些内容对于代码完成很有帮助,尽管您建议它们没有特定于代码的知识。您可能会惊讶于它们的有用性(有或没有模糊匹配)。像这些一样,当有多个候选者时,使用迷你缓冲区完成的任何代码特定的完成都会自动受益于冰柱模糊完成。
2014年

2

如果您使用ivy,则在最近的更新中,ivy支持叠加层中的点功能。Ivy在的帮助下支持模糊匹配flx。结帐这个它是如何工作的视频:)

您要做的就是,按complete-symbol默认情况下绑定到的按键绑定,然后C-M-i会弹出一个叠加层,您可以使用模糊匹配来获取完成候选。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.