英文翻譯插件介紹
明確需求
開發一款插件最先要考慮的當然是它要實現什麽功能了。比如我想做的是varname-go-die主要功能就是讓開發者有時候遇到起變量名但是不知道英文怎麽拼時,不需要切換到翻譯軟件去查找再copy過來,只需要在編輯器中輸入中文就可以實現聯網翻譯,並且可以通過一個列表選擇自己設置的常用變量格式。
這是我考慮實現的功能:
1. 在Android Studio設置界面有VarNameGoDie的設置選項,開發者可以根據自己對變量名的命名風格進行設置
2. 在編輯器輸入並選取要轉換的中文,快捷鍵啟動一個ChangeVar的Action,聯網查找翻譯並彈出設置中的變量名格式列表,選擇後替換編輯器中的中文
3. 在編輯器中輸入英文單詞也可以進行格式轉換
其中plugin.xml為項目的配置說明文件,相當於Android項目中的AndroidManifest.xml,負責一些Action、Extension等等已經項目版本信息、作者的註冊和聲明。
默認plugin.xml文件:
<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="[email protected]
<!-- 你的插件的簡介,同樣是顯示在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>
<!-- 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>
-->
<!--擴展組件註冊 要是用到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天左右的審核,就可以在插件倉庫中查詢到自己的插件並安裝使用了!
英文翻譯插件介紹