Goland(Jetbrains Idea平台)插件开发教程(二)

前言

在上一篇教程中,并没有提到太多goland的特性,只是配置了goland作为开发环境并做了一点简单的介绍,大多数还是Idea平台通用的东西。我在自己开发的插件中就做了一些live template,并集成到了插件中。下面这篇博文就来介绍一下编写live template、如何集成live template。

编写live template

俗话说万事开头难,第一步我们最好看一下官方的live template是怎么写的。

查看官方live template

在goland中自带了两大类跟golang相关的宏,一类是语法相关的,另一类就是结构体的tag了。

golang没有java注解,但是有struct tag。我们从官方的json tag入手看一下,只要我们在结构体Field后输入json就会出现这样的提示,且回车后会自动帮我们填好tag里的内容。

回车后


我们来看一下这是怎么配置的。Abbreviation就是触发的缩写了,后面的Description也可以望文生义,主要的内容就是Template是如何书写的了。

$符包裹的就是一些变量了,$END$是光标最后会停在的地方。打开Edit variables,我们可以看到其对FIELD_NAME这个变量配置了Expression,望文生义也就是将fileName转为驼峰。Expression的内容等到讲macro的时候再来看,现在只是先窥探一番。


注意在设置的左下角还有个Applicable,这里可以设置生效的范围

仿写

比如要添加xorm的tag我们就可以这样写了

效果如下

光标也确实停在END的地方

导出并在插件中集成

导出

打开File菜单,找到Manage IDE Settings => Export Settings

选中Live Templates(schemes)


这样就可以在对应的路径下找到导出的文件了。

打开可以看到如下内容

1
2
3
4
5
6
7
<templateSet group="Go Struct Tags">
  <template name="xorm" value="`xorm:&quot;$END$&quot;`" description="`xorm:&quot;&quot;`" toReformat="false" toShortenFQNames="true">
    <context>
      <option name="GO_TAG" value="true" />
    </context>
  </template>
</templateSet>

由于xml的转义实在有点恶心,所以通过这种导出的方式会比较舒服。

集成

将文件复制到resource/livetemplates目录下

创建CustomTemplateProvider.java,切记路径无需写resoure目录,也无需添加后缀名

1
2
3
4
5
6
7
8
9
10
11
12
public class CustomTemplateProvider implements DefaultLiveTemplatesProvider {
    @Override
    public String[] getDefaultLiveTemplateFiles() {
        return new String[]{"livetemplates/Go Struct Tags"};
    }


    @Override
    public @Nullable String[] getHiddenLiveTemplateFiles() {
        return null;
    }
}

在plugin.xml添加如下配置,我这是添加到原有的Go Struct Tag下,所以liveTemplateContext implementation填的是下面的配置。

1
2
3
4
    <extensions defaultExtensionNs="com.intellij">
        <defaultLiveTemplatesProvider implementation="cn.huihongcloud.golandplugin.livetemplate.CustomTemplateProvider"/>
        <liveTemplateContext implementation="com.goide.editor.template.GoLiveTemplateContextType$Tag"/>
    </extensions>

在运行前把之前添加的tag删掉,运行插件后应该也能看到我们自定义的live template了。

如果我们不想添加到这个group下,我们就要自定义TemplateContextType了,下面写一个类继承TemplateContextType

1
2
3
4
5
6
7
8
9
10
11
public class CustomTemplateContextType extends TemplateContextType {
    protected CustomTemplateContextType() {
        super("CustomTemplate", "CustomTemplate");
    }


    @Override
    public boolean isInContext(@NotNull PsiFile psiFile, int i) {
        return psiFile.getFileType().getName().endsWith(".go");
    }
}

并将livetemplate xml 的templateSet group修改为CustomTemplate,以及plugin.xml liveTemplateContext implementation修改为上面类的路径。

这样就会出现在我们自定义的group中了。

小结

这里介绍了如何添加自定义的tag作为live template。go没有java的annotation,像xorm就需要读取tag的内容,一些公司自研的框架也会用到,通过这样的配置可以少敲一些符号。
通过集成到插件里,也可以在组内比较好的同步,而不是每次新人来都去手动配置,如果有更新也只要往ide里一拖就行。
下次会介绍一下如何利用variable的expression,以及拓展macro,自己在组内实现了个通过读取函数参数以及返回内容(是单个对象或者slice)拼接查询代码的live template。

作者

ZhongHuihong

发布于

2021-08-31

更新于

2021-10-02

许可协议