英文翻译插件介绍

明确需求

开发一款插件最早要考虑的固然是它要实现什么功能了。好比我想作的是varname-go-die主要功能就是让开发者有时候遇到起变量名可是不知道英文怎么拼时,不须要切换到翻译软件去查找再copy过来,只须要在编辑器中输入中文就能够实现联网翻译,而且能够经过一个列表选择本身设置的经常使用变量格式。html

这是我考虑实现的功能: 
1. 在Android Studio设置界面有VarNameGoDie的设置选项,开发者能够根据本身对变量名的命名风格进行设置 
2. 在编辑器输入并选取要转换的中文,快捷键启动一个ChangeVar的Action,联网查找翻译并弹出设置中的变量名格式列表,选择后替换编辑器中的中文 
3. 在编辑器中输入英文单词也能够进行格式转换java

 

其中plugin.xml为项目的配置说明文件,至关于Android项目中的AndroidManifest.xml,负责一些Action、Extension等等已经项目版本信息、做者的注册和声明。 
默认plugin.xml文件:git

<idea-plugin version="2">
<id>com.your.company.unique.plugin.id</id><!--插件ID,自定义,若是要上传到Plugins仓库不能有重复ID -->
<name>Plugin display name here</name><!--插件名称-->
<version>1.0</version>
<vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor><!--邮箱和网址,上传到Plugins仓库会在你的插件界面显示 -->
github

<!-- 你的插件的简介,一样是显示在Plugins仓库信息界面 -->
<description><![CDATA[
Enter short description for your plugin here.<br>
<em>most HTML tags may be used</em>
]]></description>
编程

<!-- 版本更新信息-->
<change-notes><![CDATA[
Add change notes here.<br>
<em>most HTML tags may be used</em>
]]>
</change-notes>
app

<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
<idea-version since-build="141.0"/>
编辑器

<!--产品选择,后文会提 -->
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
on how to target different products -->
<!-- uncomment to enable plugin in all products
<depends>com.intellij.modules.lang</depends>
-->
ide

<!--扩展组件注册 要是用到applicationConfigurable即项目配置等就在这里注册-->
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
</extensions>
布局

<!--Action注册,好比在某个菜单下增长一个按钮就要在这注册 -->
<actions>
<!-- Add your actions here -->
</actions>
学习

</idea-plugin>

编写一个菜单选项

点击菜单栏都会出来各类各样的菜单选项,大部分选项都会有快捷键支持,如咱们经常使用的Undo、Copy等。 

 

Action ID:标识ID,就像Android中xml的组件@+id 
Class Name:生成的类名 
Name、Description:菜单选项的名字和描述 
Groups:定义这个菜单选项出现的位置,好比我图中设置的当点击菜单栏Edit时,第一项会出现test的选项,右边的Anchor是选择该选项出现的位置,默认First即最顶部。

点击OK后会自动生成一个TestAction.java的类:

public class TestAction extends AnAction {

@Override
public void actionPerformed(AnActionEvent e) {
// TODO: insert action logic here
//点击菜单Edit的test后会跳进这个方法
}
}

而plugin.xml中也多了一段代码,即刚刚填写的配置信息:

<actions>
<!-- Add your actions here -->
<action id="Test.ID" class="TestAction" text="test" description="test test ">
<add-to-group group-id="MainMenu" anchor="first"/>
<keyboard-shortcut keymap="default" first-keystroke="alt T"/>
</action>
</actions>

这样,一个菜单选项就完成了,接下来就要实现当用户点击test菜单或者按快捷键alt T后的功能代码了。

对话框Dialog建立

和Action的建立同样,Dialog也能够直接在在src或者包名下右键->new ->Dialog,填写类名后会生成一个xxx.java和xxx.form的文件,xxx.java就是一个继承JDialog的类,了解一点java swing编程的同窗都能看懂,而xxx.form是Intellij Idea自带的GUI Designer,能够经过可视化的界面设计轻松地建立用户界面布局。

 

只须要开发者从右边将不一样的组件拖动到中间布局的对应位置,而后在左下角设置适当的属性,则这些属性便可自动bind到xxx.java文件中的对应组件上。这简化了开发者写界面布局的繁琐操做,即便你不怎么懂swing编程,也能够很轻松地实现本身的界面。

当你设计好Dialog的界面并实现里面的数据加载和按钮或其余事件的监听操做,当你想要把它显示出来,也只须要简单的两行代码:

TestDialog dialog = new TestDialog();
dialog.setVisible(true);

编写一个Configurable功能

当你的插件须要或容许用户自定义一些配置时,好比个人插件容许用户定义本身想要生成的代码风格,只需用户打开Settings->other settings就会看到一个配置界面:

 

刚开始须要实现这个功能,找了挺久未果,在查看一些比较火的插件时发现ButterKnifeZelezny项目也有这种功能实现,所以去github找到了项目源码并模仿着实现了这个功能。因此当有时候遇到某些功能实现没有找到很好的资料时,能够去查查一些其余做者的项目,看看能不能找到相似的学习学习。

实现一个配置界面须要本身实现设置界面,而且实现Configurable的接口。实现界面像Dialog的建立同样,new->GUI Form这样也会生成一个java文件和一个form文件,一样的设计好界面,而后在java文件中实现Configurable接口,须要Override一些方法:

 

getDisplayName():Other Settings下显示的配置名称 
getHelpTopic():看方法名像是获取帮助时展现的信息,没用到 
createComponent():组件建立和初始数据配置 
apply():当配置界面点击底下的apply按钮调用该方法,通常在这里保存修改的数据 
reset():配置界面点击右上角的Reset调用该方法,通常还原初始化数据

当设计界面的时候,有时候须要自定义一些组件,好比须要在JList里加入JCheckBox之类的,直接在form中将JCheckBox拖到JList中貌似是不行的,须要在form界面右下角对应组件的Property-Value配置栏中勾选Custom Create项,就会在java文件中生成createUIComponents方法,而后在这个方法里面建立并添加。

当设计界面并在java文件中实现好功能后,只需在 plugin.xml进行注册后便可实现配置界面了:

<extensions defaultExtensionNs="com.intellij">
<applicationConfigurable instance="com.royll.varnamegodie.settings.SettingsUI"/>
</extensions>

至此,基本界面设计都完成的差很少了,下面说说我在开发项目中遇到的一些具体功能性问题。

编辑器获取用户选择内容并替换

varname-go-die首先须要获得用户选取要转换的英文/中文词组,怎么获取用户此时选取的内容呢?

Editor mEditor = e.getData(PlatformDataKeys.EDITOR);
String selectText = mEditor.getSelectionModel().getSelectedText();

这样用户此时选取的内容就得到了,那要怎样将其替换成其余内容呢?

private void changeSelectText(String text) {
Project mProject = e.getData(PlatformDataKeys.PROJECT);
Document document = mEditor.getDocument();
SelectionModel selectionModel = mEditor.getSelectionModel();

final int start = selectionModel.getSelectionStart();
final int end = selectionModel.getSelectionEnd();
Runnable runnable = new Runnable() {
@Override
public void run() {
document.replaceString(start, end, text);
}
};
WriteCommandAction.runWriteCommandAction(mProject, runnable);
selectionModel.removeSelection();
}

经过以上代码,便可成功替换用户所选的内容。

Settings配置信息保存

当用户在settings中设置自定义一些配置,你须要保存起来,并在应用到的时候读取出来。

PropertiesComponent.getInstance().setValue() //保存基本类型及String等
PropertiesComponent.getInstance().setValues() //可保存数字

获取参数的方法与之相似,Android开发的同窗一点可以轻易想到Android中相似的SharedPreferences。

 

插件打包发布、上传Plugins仓库

插件代码实现并调试成功后,若是你想要开源出来让更多的小伙伴都能用到,你只须要将本身的项目打包成jar,而后发送给须要的人,对方在Settings->Plugins界面便可经过Install plugin from disk而后在本地找到jar文件安装便可使用了。可是这样太麻烦,你想让小伙伴直接经过Browse repositories在仓库中便可找到本身开发的插件,这时你就须要将本身的jar上传到对应IDE的plugins仓库并等待经过审核。 
打包:右键项目名->Prepare Plugin Module ‘xxxx’ For Deployment,稍后会在项目下生成jar包 
发布: 
1. plugin发布到官方仓库地址 
2. 还记得plugin.xml中注释的那段代码么:

<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
on how to target different products -->
<!-- uncomment to enable plugin in all products
<depends>com.intellij.modules.lang</depends>
-->

这是指定你的插件发布到jetbrains plugins仓库的产品类型,jetbrains公司有不少种产品,而且都支持插件开发,如Intellij Idea,Android Studio等等,若是你上面那段代码注释了,那么你在上面网站上传的时候会默认上传到Intellij Idea的产品仓库,到时候只能在Intellij Idea的仓库中搜到你的插件,Android Studio是没有的。所以详细配置说明请参考上面注释中给出的网站上查看配置。个人插件将默认的<depends>com.intellij.modules.lang</depends>打开,即默认上传到因此产品仓库,即可以在多个IDE插件仓库中搜索到。 3. 修改完plugin.xml并生成jar后,到步骤1中的官网上注册用户,而后Add New Plugin,填写插件相关的信息,剩下的只要等待1天左右的审核,就能够在插件仓库中查询到本身的插件并安装使用了!

相关文章
相关标签/搜索