開發一款插件最早要考慮的固然是它要實現什麼功能了。好比我想作的是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後的功能代碼了。
和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);
當你的插件須要或容許用戶自定義一些配置時,好比個人插件容許用戶定義本身想要生成的代碼風格,只需用戶打開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中設置自定義一些配置,你須要保存起來,並在應用到的時候讀取出來。
PropertiesComponent.getInstance().setValue() //保存基本類型及String等
PropertiesComponent.getInstance().setValues() //可保存數字
獲取參數的方法與之相似,Android開發的同窗一點可以輕易想到Android中相似的SharedPreferences。
插件代碼實現並調試成功後,若是你想要開源出來讓更多的小夥伴都能用到,你只須要將本身的項目打包成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天左右的審覈,就能夠在插件倉庫中查詢到本身的插件並安裝使用了!