如何使用 Python 来“黑”你的 Eclipse IDE

暂无此类读者。
How to use Python to hack your Eclipse IDE

Opensource.com

Eclipse 高级脚本环境 (EASE) 项目是一组新的、强大的插件,可以让你快速“黑”你的 Eclipse IDE。

Eclipse 是一个强大的框架,可以通过其内置的插件机制以多种不同的方式进行扩展。然而,如果你只想添加一些额外的功能,编写和部署一个新的插件可能会很麻烦。 现在,使用 EASE,有一种更好的方法可以做到这一点,而无需编写一行 Java 代码。 EASE 提供了一种使用诸如 Python 或 Javascript 之类的脚本语言轻松自动化工作台功能的方法。

在本文中,基于我在今年 EclipseCon 北美会议上的演讲,我将介绍如何使用 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 及其模块。我们最感兴趣的是 Resource 模块,它让你能够访问 Eclipse 工作区、项目和文件 API。

install EASE nightly

成功安装这些插件后,接下来安装 EASE Jython 引擎:https://dl.bintray.com/pontesegger/ease-jython/。 安装完插件后,测试 EASE。 创建一个新项目并添加一个名为 hello.py 的新文件,内容如下

print "hello world"

选择该文件,右键单击,然后选择“Run as -> EASE script”。 你应该会在控制台中看到“Hello World”出现。

现在你可以开始编写可以访问工作区和项目的 Python 脚本了。 这种能力可以用于各种各样的“黑客”行为,下面只是一些想法。

提高你的代码质量

维护良好的代码质量可能是一项繁琐的工作,尤其是在处理大型代码库或涉及大量开发人员时。 使用脚本可以更容易地减轻一些痛苦,例如对一组文件进行批量格式化,甚至修复某些文件以删除 unix 行尾符,以便在 git 等源代码控制系统中进行轻松比较。 另一件不错的事情是使用脚本生成 Eclipse 标记来突出显示可能需要改进的代码。 这是一个示例脚本,你可以使用它为所有在 Java 文件中检测到的“printStackTrace”方法添加任务标记。 查看源代码: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 文件,你将能够在 Tasks 视图和编辑器边距中看到新创建的标记。

EASE code quality

自动化繁琐的任务

当你使用多个项目时,你可能希望自动化一些繁琐的重复性任务。 也许你需要将版权标头添加到每个源文件的开头,或者在采用新框架时更新源文件。 例如,当我们第一次切换到使用 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 项目都有一个额外的描述行。

Automate tedious tasks on EASE

原型新功能

你还可以使用 Python 脚本为某些非常需要的功能快速修复,或者作为原型来帮助向你的团队或用户展示你如何设想一个功能。 例如,Eclipse IDE 当前不支持的一项功能是在你正在处理的当前文件上自动保存。 尽管此功能正在为将来的版本开发中,但你可以拥有一个快速而粗糙的版本,该版本每 30 秒或在编辑器停用时自动保存。 以下是 main 方法的代码段。 查看完整源代码: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”设置。 然后你可以将文件添加到你的工作区,右键单击它并选择“Run As>EASE Script”。 每次保存编辑器时,都会在控制台视图中打印一条保存消息。 要关闭自动保存,只需按控制台视图中的“Terminate”红色方形按钮停止脚本即可。

Prototype new features with EASE

使用自定义按钮、菜单等快速扩展用户界面

关于 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 向 Project Explorer 工具栏添加一个按钮。 这是另一个脚本,它向同一个工具栏添加一个按钮来删除这三个项目。 查看源代码文件:createProjects.pydeleteProjects.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。 此项目现在成为查找脚本文件的默认位置。 你应该会在 Project Explorer 中看到按钮显示,而无需重新启动你的 IDE。 你应该能够使用你新添加的按钮快速创建和删除项目。

Custom buttons, menus, etc on EASE

与第三方工具集成

时不时地你可能需要使用 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 中,但此示例是你可能适用于其他第三方工具的一个示例)。

Integrate with 3rd party tools on EASE

Eclipse 高级脚本环境提供了一种通过利用 Python 的强大功能来充分利用你的 Eclipse IDE 的绝佳方式。 这是一个处于起步阶段的项目,因此还有很多东西要来。 了解更多关于该项目的信息并通过注册论坛参与其中。

我将在Eclipsecon 北美 2016 上更多地谈论 EASE。我的演讲使用 Python 编写 Eclipse 脚本 将深入探讨你如何不仅可以使用 Jython,还可以使用 C-Python,以及如何专门为科学用例扩展此功能。

标签
Tracy Miranda
Tracy Miranda 是一位软件开发人员,也是 Kichwa Coders 的创始人,Kichwa Coders 是一家专门从事用于科学和嵌入式软件的 Eclipse 工具的软件咨询公司。 Tracy 自 2003 年以来一直使用 Eclipse,并积极参与社区,尤其是 Eclipse Science Working Group。 Tracy 拥有电子系统设计背景。

2 条评论

你好!

感谢您让我发现这个 eclipse 插件!
可能性是无限的 :D

我想编写一个脚本来请求一些远程 url 以将结果作为任务包含在 eclipse 中。
你是否尝试使用像 urllib 这样的库?
我有这个错误“TypeError: 'javapackage' object is not callable”。

Eclipse 版本是否重要?

早期版本的 Jython 引擎存在此问题 (0.2.0)。 最近已经修复,因此要使其正常工作,您可以使用最新的(每日构建)版本,应该是 0.3.0。 EASE 和 Jython 引擎的版本号应匹配。 我(和其他人)很乐意在 EASE-dev 论坛上提供进一步的帮助(帖子中有链接)。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.