阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

用 Ruby 和 Eclipse Monkey 编写 IDE 脚本

  • 2007-11-01
  • 本文字数:1875 字

    阅读完需:约 6 分钟

Eclipse 等 IDE 靠着从Smalltalk IDEs 里吸收养分已经赢得了很多用户——增量编译、本地版本管理就是其中的两个。不过 Smalltalk IDEs(或Emacs等编辑器)仍然占据优势的一个领域,就是 IDE 本身的自动化:在 IDE 里将重复性的工作变成脚本。Smalltalk 用户可以直接用 Smalltalk 去访问 IDE 的对象,Emacs 用户用 LISP 可以完成同样的工作——不但可以交互式地完成,还可以在运行时进行

Eclipse Monkey 为 Eclipse 提供了一个方案——Eclipse Monkey 的名字来自著名的 Firefox 插件 GreaseMonkey。它的第一版用 JavaScript(基于 Java 的 Rhino)作为脚本语言,但 Christopher Williams 最近宣布也可以用Ruby(采用 JRuby)来编写脚本了

如果你不熟悉 EclipseMonkey,它是一组 Eclipse 插件,可以和用户交互,并用非 Java 的其他语言(最初仅支持 JavaScript)来给 IDE 写脚本。更详细的信息你可以查阅 http://www.eclipse.org/dash/monkey-help.php?key=writing 。 EclipseMonkey 的 Ruby 扩展开启了用 Ruby 代码编写 IDE 脚本的能力。

最初的版本暴露了一个 Editor DOM,让你可以用脚本去操纵编辑器。我们在 Wiki 上已经准备了一些帮助,里面描述了很多细节以及 Editor DOM 的 API 信息。我们也提供了一些示例脚本,演示如何使用这个功能。

Eclipse Monkey 的设计实践了“简单”原则——这么做是有原因的:这个项目的发起人和设计者之一是 Ward Cunningham,他与其他人一起在 1990 年代发明了Wiki 。脚本是项目中的一些文本文件;任何元数据都保存在文件自身里面。元数据包括依赖性,或者运行脚本的一个快捷方式的声明。你可以把一个脚本与Eclipse 中的任意事件挂钩,比如文件变更、文件保存或者程序启动。

下面是一段用Ruby 写的Eclipse Monkey 脚本,用来把编辑器里的String 转成Symbol

复制代码
=begin
<br></br>
Menu: Ruby > String to Symbol
<br></br>
Kudos: Christopher Williams
<br></br>
Key: M1+Shift+;
<br></br>
License: EPL 1.0
<br></br>
DOM: http://download.eclipse.org/technology/dash/update/org.eclipse.eclipsemonkey.lang.ruby
<br></br>
=end
<br></br>
# If the current token is a string containing alnums, change it to
<br></br>
# a symbol
<br></br>
editor = $editors.get_active_editor
<br></br>
selection = editor.selection_range
<br></br>
selected_src = editor.source[selection]
<br></br>
# if entire selection is a string with no dynamic content, then
<br></br>
# convert the string to a symbol
<br></br>
match = selected_src.match(/(['"])([_a-zA-Z][_\w]*)\1/)
<br></br>
return if match.nil? || match.size != 3
<br></br>
symbol = ":" + match[2]
<br></br>
editor.apply_edit(selection.first, selection.size - 1, symbol)

Eclipse Monkey 中的另一个概念是DOM,别跟 HTML 或者 XML DOM 搞混了,它代表的是 **Domain Object Model**。它是一个为特定领域的某些功能提供简化接口的一个对象。

以上面的代码为例,$editors变量指向一个处理所有与 Editors 相关之事的 DOM。为 Eclipse 这类 IDE 编写脚本,DOM 是必要的简化之举。通过直接访问 Eclipse 对象、系统及 API 来完成相同的事情也是可以的,不过写出来的脚本很可能会变得更加复杂。这是由于 Eclipse 的设计非常灵活,它具备的若干概念也造就了它的扩展能力——但也意味着像$editors.get_active_editor这样简单的一句表达式要变成 2-3 行代码。

这些 DOM 都是普通的Eclipse 插件,贡献到org.eclipse.eclipsemonkey.dom扩展点,因此在 Eclipse 的插件开发环境(PDE)中编写一个简化的功能接口是很容易的。Eclipse Monkey 的元数据也有助于 DOM 的配置管理:脚本的元数据段可以指定它所需 DOM 的 update site,当脚本运行的时候系统就会自动去获取需要的 DOM。

由于 Eclipse Monkey 脚本在 Eclipse 的 JVM 里运行,因此可以在脚本里使用所有的 Java API 和所有的 JRuby 标准库。现在已经存在很多 Eclipse Monkey DOM,让开发者得以访问 Eclipse 和 Eclipse 插件元系统提供的丰富代码和功能。

例如用JMX DOM 就可以通过JMX 来控制JVM 。通过简单的脚本就能够调用所有的JMX 操作,查询所有的JMX 属性。在实用中可以用它来从Eclipse 启动一个程序,设置程序的属性(比如日志级别),调用程序的操作(比如执行垃圾收集)——只需简单的一步。别的DOM 还可访问比如CVS/SVN 插件、工作区、JDT 等等。

更多信息可参阅 Aptana 的 Eclipse Monkey 网站,或者 Eclipse Monkey 网站的官方页面

查看英文原文: IDE scripting with Ruby and Eclipse Monkey

2007-11-01 06:011355
用户头像

发布了 225 篇内容, 共 60.9 次阅读, 收获喜欢 50 次。

关注

评论

发布
暂无评论
发现更多内容

用javascript分类刷leetcode3.动态规划(图文视频讲解)

js2030code

JavaScript LeetCode

前端工程师leetcode算法面试必备-二分搜索算法(下)

js2030code

JavaScript LeetCode

CleanMyMac试用版4.12.1下载教程

茶色酒

CleanMyMac X CleanMyMac X2023

手把手搭建视频查重系统

Zilliz

Milvus Towhee

CodeArts如何保证客户代码和应用安全?

科技怪授

华为云

《程序员修炼手册》,这521道阿里Java面试真题!真的不来看看?

钟奕礼

Java 程序员 java面试 java编程

BI智慧仓储,带你体验数字化仓储物流管理

葡萄城技术团队

阿里三面,这200道面试题免费发放,赶紧拿去收藏

钟奕礼

Java 程序员 java面试 java编程

Redis 为什么这么快,你知道 I/O 多路复用吗?

C++后台开发

redis 多线程 后端开发 C++开发 I/O 多路复用

黄金三月,跳槽旺季稳拿40k月薪,java资料免费送

钟奕礼

Java 程序员 java面试 java编程

龙蜥社区高性能存储技术 SIG 11 月运营回顾 | 龙蜥 SIG

OpenAnolis小助手

开源 高性能 存储 龙蜥社区 sig

cleanmymac2023体验版功能讲解

茶色酒

CleanMyMac CleanMyMac X2023

【12.02-12.09】写作社区优秀技术博文回顾

InfoQ写作社区官方

热门活动

Zebec获BNB Chain生态大力支持,ZBC通证将陆续登录一线平台

西柚子

鸿蒙开发实例|对象关系映射数据库

TiAmo

华为 华为云 12月月更

如何使用记事本编写 java 程序(从零开始学 Java 系列课程)

千锋IT教育

2022鸿蒙开发者大赛应用创新赛道收官,中国赛区21个优秀作品获奖

Geek_2d6073

阿里P8裸辞真实心路历程,他底气来源于Java高阶面试合集

收到请回复

Java 程序员 面试 编程语言

Redis的数据被删除,占用内存咋还那么大?

码哥字节

redis 数据 内存

成果版本支持追溯,代码来源有迹可循|ModelWhale 版本更新

ModelWhale

人工智能 机器学习 数据分析 团队协同 编程建模

【MyBatis】mybatis中#{}与${}的区别

No8g攻城狮

MySQL mybatis sql

大厂10年经验,我对Java高并发问题方案的总结,堪称教科书级

钟奕礼

Java 程序员 java面试 java编程

美团四面Java岗,终获offer,我是这么回答面试官的

钟奕礼

Java 程序员 java面试 java编程

这400道面试题,决定了你去BAT还是TMD

钟奕礼

Java 程序员 java面试 java编程

一块RTX 3090加速训练YOLOv5s,时间减少11个小时,速度提升20%

OneFlow

人工智能 深度学习 模型训练

前端工程师leetcode算法面试必备-二分搜索算法(中)

js2030code

JavaScript LeetCode

你需要知道的 14 个常用的 JavaScript 函数

千锋IT教育

政企数智办公潮水里的融云「答卷」

融云 RongCloud

办公 数智化

什么是CodeArts?

科技怪授

华为云

【分布式技术专题】「架构设计方案」盘点和总结秒杀服务的功能设计及注意事项技术体系

洛神灬殇

分布式架构 秒杀架构 12月日更

我凭借这1000道java真题,顺利拿下京东、饿了么、阿里大厂offer

钟奕礼

Java 程序员 java面试 java编程

用Ruby和Eclipse Monkey编写IDE脚本_Ruby_Werner Schuster_InfoQ精选文章