Python打造出适合自己的定制化Eclipse IDE


Posted in Python onMarch 02, 2016

Eclipse是一套强大的框架,其能够通过内置插件机制实现多种扩展方式。然而要想添加一小点额外功能,大家都不可避免地需要面临新插件的编写与部署工作,这显然有点令人头痛。现在在EASE的帮助下,我们能够以更理想的方式完成这项任务——而且整个过程不需要涉及任何一代Java代码。EASE能够让我们轻松利用Python或者JavaScript等脚本语言实现自动化工作台功能。

Python打造出适合自己的定制化Eclipse IDE 

在本篇文章中,我们将共同了解如何利用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 feature(EASE核心功能)
EASE core UI feature(EASE核心UI功能)
EASE Python Developer Resources(EASE Python开发者资源)
EASE modules (Incubation) (EASE模块,孵化)
如此一来,我们就能够使用EASE及其各项模块。在这里我们主要需要使用的是资源模块,其允许我们访问Eclipse工作区、项目以及文件API。

Python打造出适合自己的定制化Eclipse IDE 

在上述条目成功安装完成后,接下来需要安装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文件,则可以在编辑器边缘处的任务视图内查看到新近创建的标记。

Python打造出适合自己的定制化Eclipse IDE 

繁琐任务自动化处理

当大家同时处理多个项目时,大家可能希望以自动化方式处理某些繁琐而重复性的任务。大家也许需要在每个源文件起始处添加一条版权标题,或者在采用新框架时对源文件进行更新。举例来说,当我们首次面向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 

新功能原型设计

大家也可以利用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”红色按钮停止该脚本即可。

Python打造出适合自己的定制化Eclipse IDE 

利用按钮、菜单及其它条目对用户界面进行快速扩展

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重启。利用这些新按钮,我们能够快速创建并删除这三个对应项目。

Python打造出适合自己的定制化Eclipse 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当中,但这里我们只是将其作为示例,用于解释其它第三方工具的集成方式。)

Python打造出适合自己的定制化Eclipse IDE 

这套Eclipse高级脚本环境能够充分发挥Python的强大潜能,从而帮助我们灵活运用Eclipse IDE。目前此项目正处于起步阶段,因此未来还可以期待更多激动人心的功能与特性。

以上所述是关于Python打造出适合自己的定制化Eclipse IDE的相关知识,希望对大家有所帮助!

Python 相关文章推荐
Python读写Redis数据库操作示例
Mar 18 Python
Python使用新浪微博API发送微博的例子
Apr 10 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Jul 04 Python
解决DataFrame排序sort的问题
Jun 07 Python
python 提取key 为中文的json 串方法
Dec 31 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
Jan 15 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
Apr 16 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
python设置代理和添加镜像源的方法
Feb 14 Python
keras中epoch,batch,loss,val_loss用法说明
Jul 02 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 #Python
深入解析Python设计模式编程中建造者模式的使用
Mar 02 #Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 #Python
实例讲解Python设计模式编程之工厂方法模式的使用
Mar 02 #Python
详解设计模式中的工厂方法模式在Python程序中的运用
Mar 02 #Python
探究python中open函数的使用
Mar 01 #Python
Saltstack快速入门简单汇总
Mar 01 #Python
You might like
php扩展ZF――Validate扩展
2008/01/10 PHP
PHP程序员编程注意事项
2008/04/10 PHP
php的4种常见运行方式
2015/03/20 PHP
php session_decode函数用法讲解
2019/05/26 PHP
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
python函数局部变量用法实例分析
2015/08/04 Python
解析Python中while true的使用
2015/10/13 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
Python实现PS图像调整黑白效果示例
2018/01/25 Python
python爬虫基本知识
2018/03/05 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
高级运动鞋:GREATS
2019/07/19 全球购物
中国旅游网站:途牛旅游网
2019/09/29 全球购物
.net面试题
2016/09/17 面试题
竞选班干部演讲稿100字
2014/08/20 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
2015年教师节活动总结
2015/03/20 职场文书
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android