场景是这样的,我需要梳理一个项目的代码,我面对很多这样的函数签名:
| 12
 3
 4
 5
 
 | L2CircleEntityDataCacheItem GetOneCircle( int circleId );
 List<L2CircleEntityDataCacheItem> GetMultiCircles( IEnumerable<int> circleIdList );
 
 List<L2CircleEntityDataCacheItem> GetAllCircles();
 
 | 
我在写笔记的时候,希望只记录函数名,参数和返回值这种细节我就不记录了。问题来了,我要如何高效的获取这些代码片段的函数名呢?
方法自然使用正则来提取,我可以把代码片段粘贴到sublime中,然后使用正则来替换。可以使用.*\b+(\w+)\(.*这个正则来匹配所有的函数名(这个不是一个好正则,但是能用),然后在匹配全部,然后点击全选匹配的部分,然后就可以复制全部的函数名了。
这个过程还是有些痛苦的,尤其是如果你每次都要执行这个固定的步骤。当然,这个需求写一个sublime插件就可以轻松解决了,但是这么简单的任务,还需要写一个完整的插件,太痛苦了。
这个时候,我想到了jEdit。jEdit是一个基于Java的文本编辑器。应该是一个很冷门的编辑器了,因为基于Java,的确不敏捷也不漂亮,所以我当初试了一下也没管了。但是我记得他有个宏功能,可以使用Java来编写宏。这种轻量级的插件,正是我现在想要的。
先来看看jEdit长啥样:

jEdit的宏基于BeanShell,BeanShell是一个Java的脚本引擎,可以使用Java来写脚本,所以你可以使用Java来写和jEdit互操作的脚本,也就是宏。jEdit官方提供了编写宏的文档Writing Macros,同时jEdit也自带了一些宏,很有学习意义。
新建宏的入口是Macros -> New Macros。编写并保存,在Macros中就会出现你编写宏了,点击就可以运行,真的还是非常方便。而且,可以更进一步地把宏嵌入到右键菜单中,更方便使用,这个大家自己探索吧。
好,我们回过头来说说如何使用宏来实现提取函数签名的功能,代码很简单:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 
 | import java.util.regex.Matcher;import java.util.regex.Pattern;
 
 void getMethodName()
 {
 selectionString = textArea.getSelectedText();
 if(selectionString == null){
 return;
 }
 
 StringBuilder sb = new StringBuilder();
 Pattern getMethodPattern = Pattern.compile(".*\\b+(\\w+)\\(.*");
 Matcher matcher = getMethodPattern.matcher(selectionString);
 while(matcher.find()){
 String methodName = matcher.group(1);
 sb.append(methodName + "\n");
 }
 
 selections = textArea.getSelectedLines();
 if(selections.length == 0){
 selections = new int [] {textArea.getCaretLine()};
 }
 start = textArea.getLineStartOffset(selections[0]);
 stop = textArea.getLineEndOffset(selections[selections.length-1]);
 
 buffer.insert(stop-1, "\n"+sb.toString());
 }
 
 getMethodName();
 
 | 
在脚本中,jEdit自动引入了一些包:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | java.awtjava.awt.event
 java.net
 java.util
 java.io
 java.lang
 javax.swing
 javax.swing.event
 org.gjt.sp.jedit
 org.gjt.sp.jedit.browser
 org.gjt.sp.jedit.buffer
 org.gjt.sp.jedit.gui
 org.gjt.sp.jedit.help
 org.gjt.sp.jedit.io
 org.gjt.sp.jedit.msg
 org.gjt.sp.jedit.options
 org.gjt.sp.jedit.pluginmgr
 org.gjt.sp.jedit.print
 org.gjt.sp.jedit.search
 org.gjt.sp.jedit.syntax
 org.gjt.sp.jedit.textarea
 org.gjt.sp.util
 
 | 
还引入了一些全局变量:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | buffer - Buffer对象,对应着一个打开的文件
 view - View对象,对应着当面活跃的编辑窗口
 
 等价于:jEdit.getActiveView()
 
 editPane - EditPane对象,对应着一个textArea和一个buffer切换器。一个view可以被分为多个editPane
 
 等价于:view.getEditPane()
 
 textArea - JEditTextArea对象,是用于显示当前buffer的组件
 
 等价于:editPane.getTextArea()
 
 wm - DockableWindowManager对象
 
 等价于:view.getDockableWindowManager()
 
 scriptPath - 当前执行脚本的绝对路径
 
 | 
我们使用这些变量就可以很方便的和jEdit交互。我的代码中,首先使用textArea.getSelectedText()获取当前编辑区中被选中的文本,如果有,则使用正则进行处理,提取全部的函数签名,然后插入到当前选区的下一行。
这里我使用Pattern来处理正则表达式,只需要简单的import他就行了,因为可以使用jdk中的包,所以你的宏可以很强大。
看看处理效果图:

参考资料