沿着aptana的脚步,我遇到了Snippets,开始我还以为是aptana所特有的东西,原来Snippets来自Monkey-Eclipse Monkey。
什么是Monkey呢?
官方网址为
http://www.eclipse.org/dash/
Monkey是一个用于自动完成繁琐的编程任务的动枋态脚本工具。他使用javascript的语法,有其自带的开发库又可以使用某些java的函数。因为它的简单性,我认为它是区别于plugs-in的另外一种对eclipse的扩展的好工具。
来,看看Eclipse Monkey Example带给了我们什么应用。
属于Editors的命令有:Commont Lines,Leading Spaces to Tabs,Leading Tabs to Spaces。
属于Experimental的命令有:Colorize as HTML,Exercise Editor,Load Metadata,Show Lexemes,Show Parse Tree.
......
不一一列举了。
学习的资料是少,我看了看代码,理解出了用法。仿照着写了两个Snippets,分别完成两个单独的功能。注意,由我自己的经验是需要3.2以上版本才对aptana与monkey有很好的支持。如果先装了aptana之后再装monkey的话,如monkey的文档所说到的monkey example很难加载到菜单上,需要手动修改配置,具体方法还没确定,如果先装了monkey,就可以先新建出monkey example再装aptana,这样我们开发Snippets就简单多了,直接生成了个workplace中的项目,写完Snippets保存,马上就能通过Snippets视图中双击加载上的Snippets来运行。就建出的项目的Snippets也能马上保存到Snippets视图中。
一.给某行代码加上"//"的注释符号,这样类似于eclipse中的Ctrl+?键的功能,但简单实现当以经是"//"注释的时候依然加上"//",文件所处的位置对Snippets没影响。
/**/
/*
* Menu: Editor > lines
* Kudos: Kevin Lindsey
* License: EPL 1.0
* DOM: http://download.eclipse.org/technology/dash/update/org.eclipse.eclipsemonkey.lang.javascript
* DOM: http://localhost/com.aptana.ide.scripting
*/
//
文件头必须这样定义好,在开头,还有其它可定义的属性,Menu就是加载到eclipse中的执行命令的位置
//
DOM应该是类似于类库的一样东西,选择需要加入
/**/
/**
* main
*/
//
main是执行的方法的入口
function
main()
{
var editor = editors.activeEditor;
var range = editor.selectionRange;
var startLine = editor.getLineAtOffset(range.startingOffset);
editor.beginCompoundChange();
var offset = editor.getOffsetAtLine(startLine)
editor.applyEdit(offset,0,"//");
editor.endCompoundChange();
}
二.这是一个很有用的功能,打开所编辑文件的所在文件夹,并对该文件选定。不知道为什么 editors.activeEditor.textEditor.getFileContext()只对aptana方式打开的文件有效。
/**/
/*
* Menu: File > OpenDir
* Kudos: Kevin Lindsey
* License: EPL 1.0
* DOM: http://download.eclipse.org/technology/dash/update/org.eclipse.eclipsemonkey.lang.javascript
* DOM: http://localhost/com.aptana.ide.scripting
*/
/**/
/**
* main
*/
function
main()
{
try {
//获取文件路径
var filename = editors.activeEditor.textEditor.getFileContext().getSourceProvider().getSourceURI();
filename = filename.replace("%20"," ");
//调用系统命令
java.lang.Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL Explorer.exe /select," + filename);
} catch(e) {
Packages.org.eclipse.jface.dialogs.MessageDialog.openInformation(
window.getShell(),
"Monkey Dialog",
e
)
}
}
进一步深入Snippets。
在Script头里面有一个DOM属性,他确实是库的引入功能。如DOM:http://download.eclipse.org/technology/dash/update/org.eclipse.eclipsemonkey.lang.javascript就是引入了在plug-in中org.eclipse.eclipsemonkey.lang.javascript_0.1.10.15171.jar中所包函的类库,他是DOM的一个扩展,所以带给了我们了一些内置的变量来提高我们的开发效率,如:resources,views,io,editors。在Eclipse Monkey Example中,这些内置变量出现的用法为
resources
//
资源对象
var
files
=
resources.filesMatching(
"
.*\\.java
"
); \\找到所有.java文件
views
//
视图对象
var
webView
=
views.getView(
"
GooleWebView
"
); \\生成一个视图
editors
//
编辑器对象
var
editor
=
editores.activeEditor;\\得到一个活动的编辑器
具体这些变量还有什么属性和方法,我参考了在org.eclipse.eclipsemonkey.lang.javascript_0.1.10.15171中的原代码,如resources类,找到org.eclipse.eclipsemonkey.lang.javascript_0.1.10.15171\src\org\eclipse\eclipsemonkey\lang\javascript\doms\resources下的Resources.java,可以发现类里面就对应有一个filesMatching方法,而对于editores,在其构造函数中找到如下代码:
String[] names
=
new
String[]
{
//"open",
"toString"
}
;
this
.defineFunctionProperties(names, Editors.class, PERMANENT
|
READONLY);
this
.defineProperty(
"
all
"
, Editors.class, PERMANENT
|
READONLY);
this
.defineProperty(
"
activeEditor
"
, Editors.class, PERMANENT
|
READONLY);
这就告诉我们这个变量里面,我们可以使用all,activeEditor属性和toString方法。
另外在plugins\com.aptana.ide.scripting_0.2.8.15171\docs中,提供了部分的js的接口,里面有描述部份变量和对象的使用,如Editors.js,File.js,Global.js等。
在上一节中,我提到了一个问题就是在我编写的打开程序所在的文件夹时候,只能打开aptana方式打开的视图的文件,通过追查源码,我发现,aptana中提供的editor有css,html,js,php,xml这些编辑器类中都有提供了一个getFileContext()方法,而这是eclipse原来的视图所不一定具有的,所以提示错误为找不到getFileContext()方法。
Snippets是一个辅助工具,灵活简单,特别是在文本处理上能提供很好的帮助。但是他的功能还是受到局限,开发复杂的操作还是选用eclipse的plug-in功能为好。其待Snippets有很好的发展。