通过音译(ae,oe,ue)查找带有变音符号(ä,ö,ü)的类/文件/符号

时间:2016-11-03 08:21:50

标签: intellij-idea intellij-plugin

我正在处理使用德语来命名类,符号和文件的代码。所有德语特殊字符如ä,ü,ö和ß都以音译形式使用,即“ae”代表“ä”,“oe”代表“ö”等。

由于没有技术上的理由再这样做,我正在评估是否允许以自然形式使用变音符号等是可行的。这里最大的问题是,一旦使用变音符号,将会有不一致的命名。即一个类可以命名为“ÖffentlicheAuftragsübernahme”(新形式)或“OeffentlicheAuftragsuebernahme”(旧形式)。这将使搜索类,符号和文件更加困难。

有没有办法扩展IntelliJ IDEA的搜索(确切地说是代码导航),忽略名称是用变音符号还是用音译编写的?

我想,这需要修改IDEA索引文件的方式。插件可以实现吗?或者是否有不同的方法来实现预期的结果?

实施例

鉴于课程“KlasseÄ”“KlasseAe”,“KlasseOe”,“KlasseÜ”

IDEA“导航到课程”(CTRL + N) - >找到结果

  • “KlasseÄ” - > [“KlasseÄ”“KlasseAe”]
  • “KlasseAe” - > [“KlasseÄ”“KlasseAe”]
  • “KlasseUe” - > [ “KlasseÜ”]
  • “KlasseÖ” - > [ “KlasseOe”]

2 个答案:

答案 0 :(得分:0)

实际上这很容易实现,不需要索引更改。您需要做的就是实现ChooseByNameContributor接口并将其注册为gotoClassContributor扩展点的扩展。在您的实现中,您可以使用IDEA的现有索引来查找具有拼写替代名称的类,并从getItemsByName返回它们。

答案 1 :(得分:0)

您可以提供自己的com.intellij.navigation.GotoClassContributor实例,并在getItemsByName()中查找PSI类索引中输入名称的不同变体。

例如,如果您扩展com.intellij.ide.util.gotoByName.DefaultClassNavigationContributor,则可以实现如下方法:

@Override
@NotNull
public NavigationItem[] getItemsByName(String name, final String pattern, Project project, boolean includeNonProjectItems) {
    List<NavigationItem> result = new ArrayList<>();
    Processor<NavigationItem> processor = Processors.cancelableCollectProcessor(result);

    List<String> variants = substituteUmlauts(name);

    for (String variant : variants) {
        processElementsWithName(variant, processor, FindSymbolParameters.wrap(pattern, project, includeNonProjectItems));
    }

    return result.isEmpty() ? NavigationItem.EMPTY_NAVIGATION_ITEM_ARRAY :
            result.toArray(new NavigationItem[result.size()]);
}

substituteUmlauts()将计算您在搜索框中输入内容的所有不同版本,所有结果将汇总在result中。