Eclipse的java编辑器的改进

用久了visual studio,偶尔用一下eclipse写java程序会发觉它自带的java编辑器在许多方面不尽人意。

用过visual studio的人想必都知道visual assist这个小软件,强大的代码提示和辅助输入大大提高了代码的编辑速度。eclipse下也有一个类似的插件叫做“content assist”,但是默认情况下这个插件使用起来比visual assist效果差很多,可能用惯了vs的人才会这么觉得,而第一语言就是java的人或许就会觉得eclipse的辅助输入已经很不错了或者直接不用辅助输入也挺好。但终究软件应该去适应人的需要,而不是让人去适应软件。

下面就来讲怎么一步步把eclipse的java编辑器修改为与vs类似的样式。

首先是代码样式与代码着色。其实eclipse自带的content assist功能已经很强大了,但是其默认设置却让人很不习惯。好在eclipse的软件结构就是一堆插件(plugin)的大杂烩,几乎每一个插件都对应的个性化配置界面,打开“window/preferences”即可进入配置界面。eclipse的另一个好处就是对各个插件的配置可以导出为一个“*.epf”文件,我根据个人偏好设置的eclipse代码风格如下面截图所示。

 

 

插图1

在上图中改变了编辑器的字体为“sans comic ms”,代码的着色基本与visual assist的默认设置一致,用惯了vs的人会很习惯。另外代码风格由默认的“K&R”风格改为了“BSD”风格,即花括弧上下对齐。(上图中是eclipse的代码,所以还是“K&R”风格)

包括上述“*.epf”配置文件在内的所有资源都可以在http://download.csdn.net/source/3321754下载到。打开eclipse选择“file/import”,选择“general/preference”,点下一步,选择资源中的“*.epf”文件,点击完成即可。

 

然后是代码提示与辅助输入。

eclipse的辅助输入功能默认情况下很弱,首先是只能对不超过5个字符自动激活提示功能,默认情况下是“.abcd”,以其他字母或字符开始的输入都不会自动开启辅助输入。其实eclipse的想法是在需要的时候采用快捷键(ALT+/)的方式启动,貌似不太鼓励使用辅助输入。事实上通过查看eclipse的源代码会发现eclipse在加载用户设置的自动激活字符列表的时候采用一个初始大小为5的StringBuffer去加载,不过好在StringBuffer会在加载量超过5之后自动申请空间,所以通过修改配置文件的方法可以将激活字符数量增加到任意个数,(http://hi.baidu.com/zkheartboy/blog/item/3f23e61fd8c7d0f6e1fe0ba4.html中有详细步骤),我采用的激活字符列表是 abcd...xyzABCD...XYZ_ 。在第一步中加载了引用资源中的“*.epf”文件就会作此设置。

eclipse的辅助输入还有些不人性化的并且不能通过个性化配置修正的地方:

1.候选列表中选中的条目插入编辑器的方式为输入空格键、“=”和回车键,前两种方式会在很多时候导致误操作。反观visual assist则利用TAB键,误操作会少很多。

2.候选列表内的条目排序始终不变,如果我们经常使用的一个变量名处在列表比较靠下的位置那用辅助输入反而会很不方便。而visual assist会记忆用户最近的输入,经常使用的条目会被优先选中。

3.在输入错误时,我们尝试删除开头的几个字母,但字母删完之后候选列表依旧存在,往往我们期望删除整个变量后候选列表也随之自动消失,但eclipse自带的辅助输入无法做到。visual assist可以这样。

综合以上三点,eclipse的辅助输入在一些细节上做的不尽人意,而辅助输入这些用来方便用户的软件很可能就因为一个细节处理不好而丢失大量的用户,难怪很多eclipse的用户主张不使用辅助输入或者让辅助输入不自动激活。通过下文的一些改进希望会改变一些eclipse老用户的看法。

eclipse提供了几个插件扩展点用于改善其“content assist”的性能:一个是“org.eclipse.jdt.ui.javaCompletionProposalComputer”,这个扩展点用于定义当前上下文可以获取的辅助输入的代码来源,如java关键字、已有局部变量、类成员、输入模板等等;另一个是“org.eclipse.jdt.ui.javaCompletionProposalSorters”,这个扩展点定义了对获取的辅助选项进行排序的方式。eclipse的这种OSGi风格的软件结构非常漂亮,用户对软件自定义的空间就很大,这是visual studio所不及的地方。但eclipse的开源也导致软件无法做到商业非开源软件那样对用户的需求精益求精。

事实上上述两个扩展点对于修正上面的三个问题几乎无能为力,而我们只好深入到content assist所在的eclipse插件去修改源码了,这个插件是eclipse/plugins下的“org.eclipse.jface.text_*.*.*.jar”,可以通过SDK版的eclipse导入为源代码工程。

 

1.候选列表上屏键修改

在导入工程下的“org.eclipse.jface.text.contentassist.CompletionProposalPopup#verifyKey()”函数中有一段代码

if (contains(triggers, key)) {

...

将这段代码改为

if (key!='=' && key!=0x20 && contains(triggers, key)) {

...

还有这段代码之上的代码注释

 

// case '/t':

// e.doit= false;

// fProposalShell.setFocus();

// return false;

修改为

 

case '/t':

e.doit= false;

insertSelectedProposalWithMask(e.stateMask);

break;

经过上述操作,这个辅助输入插件已经排除了空格与“=”的选中功能,增加了TAB键的选中功能。

 

 

 

2.记忆最近输入

这个要写一个类来记录最近的用户选中条目情况,即最终通过TAB键或回车键敲上屏幕的条目。一般记录20个左右的最近输入,然后将每次输入候选列表(proposals)中的选项按照在最近输入中出现的顺序,按照由近及远的顺序把最近的前几个(如可设置5个)适宜的项置顶,这样最近输入的那些变量、关键字或输入模板会优先出现在候选列表的上方,使得辅助输入更加便捷。

具体的代码略微有点多,这里就展示了,带该原理就是上面讲的了。举例说明它的使用:

String str1="s1",str2="s2",str3="s3";

System.out.println(str3);

str3="something else";

System.out.println(str3);

在第一次输入“System.out.println(str3);”时辅助列表如下:

 

插图2

第二次输入“System.out.println(str3);”时辅助列表如下:

 

 

插图3

而在原来的辅助输入下辅助列表一直如下:

 

插图4

 

 

3.回删完整个变量后提示自动消失

默认情况下一旦提示出现,即使整个变量被删除,代码提示窗口会一直存在,这并不方便。

分析content assist的代码会看到content assist存储了两个列表“fComputedProposals;”和“fFilteredProposals;”,即一个是当前可能存在的候选列表,另一个是根据已经输入的字符过滤之后剩下的候选选项。当我们由左向右敲字时content assist就一直filter变量fFilteredProposals,当我们从右往左删除时,就会从fComputedProposals去重新filter,当删除到content assist的激活处后,又会重新经过一番复杂的操作更新fComputedProposals。

我们要做的就是在删除到更新fComputedProposals之前检查当前光标之前的字符是否是在激活字符列表内,若不是则关闭代码提示。这样当删除到一个变量开头时,光标之前的字符就是“=”、“/t”、“/n”、“/r”、“ ”等等,总之不会是激活字符列表内的字符,这样就实现了代码提示的自动关闭。

 

上述实现可以在http://download.csdn.net/source/3321754下载得到,使用目录下的“org.eclipse.jface.text_*.*.*.jar”替换“eclipse/plugins/”目录下的“org.eclipse.jface.text_*.*.*.jar”文件即可,之前的文件请自行备份。

注:若“eclipse/plugins/”目录下该文件的版本比资源中提供的低则可保留,eclipse会自动加载更高版本的插件,反之则原来的文件不可保留。


新版针对Eclipse 3.7(Indigo)的下载地址:

http://download.csdn.net/detail/caoweiquan322/4347729

主要功能在于增强了Indigo下的C++编辑器CDT的输入功能。

 

 

鸣谢

在庞大的content assist中寻找改动的地方离不开强大的查找功能,RealZYC的“advance search”插件实现了这一功能,而eclipse自带的查找功能仅支持当前文件内的查找,弱得很。RealZYC的强大自不必说,

附上他的插件下载地址http://download.csdn.net/source/2219548

 

 

IMMJ

2011-06-03

 

 

 

 

 

 

你可能感兴趣的:(Eclipse的java编辑器的改进)