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中的hashlib和base64加密模块使用实例
Sep 02 Python
Python 自动补全(vim)
Nov 30 Python
Python的Twisted框架上手前所必须了解的异步编程思想
May 25 Python
Python如何实现文本转语音
Aug 08 Python
python3爬取淘宝信息代码分析
Feb 10 Python
python selenium 获取标签的属性值、内容、状态方法
Jun 22 Python
Django分页功能的实现代码详解
Jul 29 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
python3实现Dijkstra算法最短路径的实现
May 12 Python
Pytorch 实现变量类型转换
May 17 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 curl模拟post请求小实例
2013/11/13 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
javascript实现数字验证码的简单实例
2014/02/10 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
如何使用angularJs
2017/05/08 Javascript
使用JavaScript实现点击循环切换图片效果
2017/09/03 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
python测试mysql写入性能完整实例
2018/01/18 Python
python实现泊松图像融合
2018/07/26 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
python如何操作mysql
2020/08/17 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
python实现视频压缩功能
2020/12/18 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
歌唱比赛策划方案
2014/06/06 职场文书
环保志愿者活动总结
2014/06/27 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
公司车辆管理制度
2015/08/04 职场文书
音乐研修感悟
2015/11/18 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
PHP 时间处理类Carbon
2022/05/20 PHP