如何利用Python打造出適合自己的定製化Eclipse IDE?
Eclipse是一套強大的架構,其能夠通過內建外掛程式機制實現多種擴充方式。然而要想添加一小點額外功能,大家都不可避免地需要面臨新外掛程式的編寫與部署工作,這顯然有點令人頭痛。現在在EASE的協助下,我們能夠以更理想的方式完成這項任務——而且整個過程不需要涉及任何一代Java代碼。EASE能夠讓我們輕鬆利用Python或者JavaScript等指令碼語言實現自動化工作台功能。
在本篇文章中,我們將共同瞭解如何利用Python與EASE設定Eclipse環境,同時考量多種利用Python強化IDE方案的可行途徑。
設定並運行“Hello World”
今天文章中所涉及的各項樣本基於Python Java實現方案,即Jython。大家可以直接將EASE安裝至現有Eclipse IDE當中。不過在此次樣本內,我們採用Eclipse Mars並安裝EASE本體、其模組以及Jython引擎。
在Eclipse安裝對話方塊之內Help>Install New Software...),安裝EASE: http://download.eclipse.org/ease/update/nightly
接下來,勾選以下組件:
- EASE Core featureEASE核心功能)
- EASE core UI featureEASE核心UI功能)
- EASE Python Developer ResourcesEASE Python開發人員資源)
- EASE modules (Incubation) EASE模組,孵化)
如此一來,我們就能夠使用EASE及其各項模組。在這裡我們主要需要使用的是資源模組,其允許我們訪問Eclipse工作區、項目以及檔案API。
在上述條目成功安裝完成後,接下來需要安裝EASE Jython引擎:https://dl.bintray.com/pontesegger/ease-jython/。一旦各外掛程式安裝完畢,下面需要測試EASE。建立一個新項目並通過以下命令添加一個名為hello.py的檔案:
- print "hello world"
選定該檔案,右鍵點擊並選擇“Run as -> EASE script”。這時大家會看到控制台中顯示“Hellp World”。
現在大家可以開始編寫能夠接入工作區與項目的Python指令碼了。從這裡開始,我們立足於以下幾項目標對IDE進行調整。
改進代碼品質
保證良好的代碼品質是一項非常困難的任務,特別是在程式碼程式庫規模龐大或者涉及多位開發人員的情況之下。其中部分難題能夠通過引入指令碼得到輕鬆解決,例如對某類檔案進行批量格式調整,或者在git等原始碼控制體系內移除unix結尾行以簡化檔案內容對照等。另外值得強調的是,我們也可以利用指令碼產生Eclipse標記,從而以代碼高亮顯示的方式實現功能改進。以下指令碼樣本可用於將任務標記機制添加至全部“printStackTrace”方法,從而實現Java檔案內部檢測。點擊此連結查看原始碼: markers.py
首先在工作區內複製檔案,而後右鍵點擊對應檔案並選擇“Run as -> EASE script”。
- loadModule('/System/Resources')
-
- from org.eclipse.core.resources import IMarker
-
- for ifile in findFiles("*.java"):
- file_name = str(ifile.getLocation())
- print "Processing " + file_name
- with open(file_name) as f:
- for line_no, line in enumerate(f, start=1):
- if "printStackTrace" in line:
- marker = ifile.createMarker(IMarker.TASK)
- marker.setAttribute(IMarker.TRANSIENT, True)
- marker.setAttribute(IMarker.LINE_NUMBER, line_no)
- marker.setAttribute(IMarker.MESSAGE, "Fix in Sprint 2: " + line.strip())
如果大家已經擁有部分包含printStackTraces的Java檔案,則可以在編輯器邊緣處的任務檢視內查看到新近建立的標記。
繁瑣任務自動化處理
當大家同時處理多重專案時,大家可能希望以自動化方式處理某些繁瑣而重複性的任務。大家也許需要在每個源檔案起始處添加一條著作權標題,或者在採用新架構時對源檔案進行更新。舉例來說,當我們首次面向Tycho以及Maven進行切換時,我們需要為每個項目添加一個pom.xml檔案。只需幾行Python代碼即可輕鬆完成這項工作。但由於Tycho目前已經支援無pom構建,因此我們又需要移除這些不必要的pom檔案。同樣的,幾行Python指令碼即可實現這一訴求。舉例來說,在這裡我們利用以下指令碼向工作區內的每個已開啟項目添加一個README.md檔案——當然,前提是它們屬於Java或者Python項目。點擊以下連結查看原始碼:add_readme.py.
要運行這套指令碼,將該檔案複製至工作區,而後右鍵點擊這個檔案並選擇“Run as -> EASE script”。
- loadModule('/System/Resources')
-
- for iproject in getWorkspace().getProjects():
- if not iproject.isOpen():
- continue
-
- ifile = iproject.getFile("README.md")
-
- if not ifile.exists():
- contents = "# " + iproject.getName() + "\n\n"
- if iproject.hasNature("org.eclipse.jdt.core.javanature"):
- contents += "A Java Project\n"
- elif iproject.hasNature("org.python.pydev.pythonNature"):
- contents += "A Python Project\n"
- writeFile(ifile, contents)
結果就是,每個已開啟項目都將擁有一個README.md檔案,而Java與Python項目則擁有額外的描述行。
新功能原型設計
大家也可以利用Python指令碼對大部分所需功能進行快速修複,或者將其作為原型設計以協助團隊成員或者使用者瞭解如何使用這項新功能。舉例來說,Eclipse IDE目前尚不支援對正在處理的檔案進行自動儲存。雖然這項功能肯定會在未來的版本中出現,但大家仍然可以自己動手讓當前檔案每隔30秒或者在編輯器被關閉時進行自動儲存。以下為主方法中的程式碼片段。點擊以下連結查看完整原始碼: autosave.py
- def save_dirty_editors():
- workbench = getService(org.eclipse.ui.IWorkbench)
- for window in workbench.getWorkbenchWindows():
- for page in window.getPages():
- for editor_ref in page.getEditorReferences():
- part = editor_ref.getPart(False)
- if part and part.isDirty():
- print "Auto-Saving", part.getTitle()
- part.doSave(None)
在運行此指令碼之前,大家還需要在Window > Preferences > Scripting內的對話方塊中勾選“Allow Scripts to run code in UI thread”允許指令碼在UI線程內運行代碼)選項。如此一來,大家就能夠將該檔案添加到工作當中,右鍵對其進行點擊並選擇“Run as -> EASE script”。每當編輯器進行儲存操作時,控制台視圖中都會輸出一條儲存資訊。而要關閉自動儲存功能,大家只需在控制台視圖內點擊“Terminate”紅色按鈕停止該指令碼即可。
利用按鈕、菜單及其它條目對使用者介面進行快速擴充
EASE的最佳特性之一在於允許大家使用自己的指令碼,同時將其快速鉤入IDE內的UI元素——作為新按鈕或者新的菜單條目。不需要編寫Java代碼或者使用新外掛程式,只須在指令碼標題處添加幾行內容即可——就是這麼簡單。
以下樣本為一套簡單指令碼,負責為我們建立三個新項目:
- # name : Create fruit projects
- # toolbar : Project Explorer
- # description : Create fruit projects
-
- loadModule("/System/Resources")
-
- for name in ["banana", "pineapple", "mango"]:
- createProject(name)
指向EASE的注釋行負責向專案管理器工具列添加一個新按鈕。下面展示的是另一套指令碼,負責在同一工具列內添加另一個按鈕,從而將這三個項目徹底刪除。點擊以下連結查看其原始碼: createProjects.py與deleteProjects.py。
- # name :Delete fruit projects
- # toolbar : Project Explorer
- # description : Get rid of the fruit projects
-
- loadModule("/System/Resources")
-
- for name in ["banana", "pineapple", "mango"]:
- project = getProject(name)
- project.delete(0, None)
為了讓這些按鈕正確顯示,我們還需要向新項目中添加兩個指令檔——這裡我們將新項目稱為“ScriptsProject”。接下來一步步開啟Windows > Preference > Scripting > Script Locations。點擊“Add Workspace”按鈕並選擇ScriptsProject。此項目現在已經成為指令檔存放的預設位置。這時大家應該可以在專案管理器內直接查看到這些按鈕,而不必進行IDE重啟。利用這些新按鈕,我們能夠快速建立並刪除這三個對應項目。
與第三方工具相整合
大家可能隨時需要使用Eclipse生態系統之外的工具選項而且必須承認,雖然Eclipse本身非常強大,但仍有力有不逮的領域)。對於此類情境,大家可以非常便捷地將封包請求與工具調用添加到指令碼當中。以下樣本允許大家整合explorer.exe,同時將其添加到內容菜單當中,這樣我們就可以利用現有選擇隨時開啟檔案瀏覽器了。點擊以下連結查看其原始碼:explorer.py
- # name : Explore from here
- # popup : enableFor(org.eclipse.core.resources.IResource)
- # description : Start a file browser using current selection
- loadModule("/System/Platform")
- loadModule('/System/UI')
-
- selection = getSelection()
- if isinstance(selection, org.eclipse.jface.viewers.IStructuredSelection):
- selection = selection.getFirstElement()
-
- if not isinstance(selection, org.eclipse.core.resources.IResource):
- selection = adapt(selection, org.eclipse.core.resources.IResource)
-
- if isinstance(selection, org.eclipse.core.resources.IFile):
- selection = selection.getParent()
-
- if isinstance(selection, org.eclipse.core.resources.IContainer):
- runProcess("explorer.exe", [selection.getLocation().toFile().toString()])
為了讓該菜單得到正確顯示,我們需要將該指令碼添加至一個新項目當中——我們仍然將其稱為“ScriptsProject”。接下來前往Windows > Preference > Scripting > Script Locations。點擊“Add Workspace”按鈕並選擇ScriptsProject。現在,大家應該能夠在右鍵某個檔案後看到該新菜單條目顯示在快顯功能表當中。點選以開啟檔案瀏覽器。需要注意的是,這項功能目前已經存在於Eclipse當中,但這裡我們只是將其作為樣本,用於解釋其它第三方工具的整合方式。)
這套Eclipse進階指令碼環境能夠充分發揮Python的強大潛能,從而協助我們靈活運用Eclipse IDE。目前此項目正處於起步階段,因此未來還可以期待更多激動人心的功能與特性。感興趣的朋友可以點擊此處查看該項目說明或者點擊此處參與其相關論壇英文原文)。
我們將在2016年的Eclipsecon北美大會上就EASE做出更為詳盡的介紹。在屆時進行的《利用Python實現Eclipse指令碼化》主題演講中,除了現有Jython之外,我還將探討C-Python以及如何將其功能擴充至科學用例當中。敬請期待!
原文標題:How to use Python to hack your Eclipse IDE
Bkjia譯稿,合作網站轉載請註明原文譯者和出處為bkjia.com】