UltraEdit编辑器使用技巧(内置JS脚本)

前言:

我使用的UE版本是14.20,应该是现今较通用版本。恕其他版本无暇多予比对。之前一直用Editplus,因速度比较快,功能也尚可,且以前版本的UE没什么独到之处,直到用了14.20,用了其强大的自定义功能,以及内置JS脚本(而非过于弱智的宏),才彻底抛弃Editplus,转而研究UE,并彻底被其吸引……

一、脚本使用

首先讲讲UE使用脚本的好处和基本原理:

使用脚本相当于是把外置的一个程序引用到编辑器之中,作为它的一个可执行命令,就好像我们UE中编辑->删除->删除至行尾;或者在word之中,可以选中一段内容->右键->选择格式相似的文本(这个例子可能不恰当,因为这已经不是纯文本编辑,而是附带了格式的。但其本质是一样的)。如果我们要使用自己特有的功能,而不是系统提供的呢?如果我要统计文本里面有多少个字符串”TEST”怎么做?我要统计只在行首显示的”TEST”怎么做?如果我不但要统计有多少个行首的”TEST”,还要把这些行都重新复制到一个新的文本,该怎么做?在数据量小的时候,可以手工操作,可如果这是一个50K的文本,估计一天之内,你就不用干别的了,如果是500K呢?!

本质上来说脚本和宏的道理是一样的,只是宏靠的是录制,记录你一连串的操作,以便之后你再使用同样的操作的时候,可以仅仅点击一下鼠标或者用个快捷键,就实现了之前的一连串操作。但是如果你没有确定的操作该怎么办呢?就好像刚刚说的“不单要统计有多少个行首的”TEST”,并且还要把这些行都重新复制到一个新的文本”,这个操作到底该怎么录制,我还真说不清楚……估计不录个十次八次的,谁都不知道自己的操作对不对。因此说,宏有它的局限性,不适于过于复杂的操作,当然宏本身也是可以编辑的,但是相对于脚本语言来说,晦涩难懂的宏语句绝对不是给人看的……据说有“编辑器之神”之称的Emacs就是靠它的内置脚本编辑方法,维护着绝对老大的地位。我无缘接触Emacs,幸好UE也终于有了这个功能,并且用的还是比较普及的JS脚本。

接下来,就从脚本开始吧:

基本上教程都是以”Hello world”开始的,我也写了一个
UE-JS的”Hello world”,如下:
UltraEdit.activeDocument.write("Hello world!"); //在当前活动窗口写入” Hello world!”
UltraEdit.messageBox("Hello world!"); //弹出消息框” Hello world!”

首先,新建一个空的js文件(如t.js)。打开“脚本->脚本”,再弹出的窗口里点“添加”,引入刚刚写的空文件,然后选中刚刚引入的那个文件,编辑。写入上面的内容。在某一活动窗口,”脚本->t.js”。你就会看到窗口中写入了” Hello world!”,然后还有一个弹出框显示” Hello world!”,调试通过这个,就可以开始写其他的脚本程序了。
我使用的例子数据如下:
this is the test data.
#this is the test data.
this is the test data.
this is the test data.
test this is the test data.
test this is the test data.
test this is the test data.
test this is the test data.
test this is the test data.
test #this is the test data.
test this is the test data.
test this is the test data.
test this is the test data.
test this is the test data.
test this is the test data.
test this is the test data.
test this is the test data.
this is the test data.
this is the test data.
#this is the test data.
this is the test data.
this is the test data.
this is the test data.
this is the test data.
this is the test data.
this is the test data.
this is the test data.
this is the test data.

二、程序举例
1. 下面以刚刚的“如果我要统计文本里面有多少个字符串”TEST”怎么做?”为例,讲解UE-JS。

UltraEdit.activeDocument.top(); //把光标移至文本的最顶端

var str_f = "test"; //要搜索的字符串
var cnt1 = 0; //个数统计

UltraEdit.activeDocument.findReplace.find(str_f);  //查找字符串 str_f

while (UltraEdit.activeDocument.isFound()) //如果找到要查询的字符串,则执行下面程序
{
    cnt1 = cnt1 + 1;
    UltraEdit.activeDocument.findReplace.find(str_f); //再一次查找
}
UltraEdit.messageBox("共搜索到 " + cnt1 + "个字符串"); //弹出窗口显示结果


以上程序相当于是用程序步骤模仿手工操作,并同时加上手动的计数。程序不会重新从头搜索,所以向下搜不到字符串的时候,就跳出循环,显示结果了。

这个需求也有另一种办法来做——全部通过标准的JS。此种方法不是很推荐,但本质上来说更加灵活,适于JS方面比较擅长者,在此我也写出来供大家参考。JS的function 我就不多做解释了,因为其很灵活,我只是随便用了一种。

function count_str(text_all,str_f)
{
    var result = "";
    result = text_all.split(str_f);

    return result.length - 1;
}

UltraEdit.activeDocument.selectAll(); //选择全部文本
var text_all = UltraEdit.activeDocument.selection; //获取文本为字符串
var str_f = "test"; //要搜索的字符串

var cnt1 =count_str(text_all,str_f); //调用函数 count_str

UltraEdit.messageBox("共搜索到 " + cnt1 + "个字符串"); //弹出窗口显示结果

2. 我们再看“我要统计只在行首显示的”TEST”怎么做?”
这个时侯就需要用到正则表达式了,正则表达式作为“非人类语言”,本身值得重新讲一次,但是网上已经有很多相关的资料,本人的水平也有限,就不再赘述了。各位可以自己去看看,UE本身也有正则表达式的参考,仔细研究研究都能明白。闲话少说,看程序:

UltraEdit.activeDocument.top(); //把光标移至文本的最顶端

UltraEdit.activeDocument.findReplace.regExp = true;  //使用正则表达式查找
var str_f = "^test"; //要搜索的字符串:行首的"test"
var cnt1 = 0; //个数统计

UltraEdit.activeDocument.findReplace.find(str_f);  //查找字符串 str_f

while (UltraEdit.activeDocument.isFound()) //如果找到要查询的字符串,则执行下面程序
{
    cnt1 = cnt1 + 1;
    UltraEdit.activeDocument.findReplace.find(str_f); //再一次查找
}
UltraEdit.messageBox("共搜索到 " + cnt1 + "个字符串"); //弹出窗口显示结果

同上面第一个程序,这个也可以全部通过标准的JS来做。不过在这里再写出来意义不大。不再重复。

3. 我们最后再看看“如果我不单要统计有多少个行首的”TEST”,并且还要把这些行都重新复制到一个新的文本,该怎么做?”

这里不单要读,要匹配查询,还要写到其他的文件里,稍微要再多一个步骤。略有不同的地方是“UltraEdit.document[0].write(line);”这一句,表示把一个字符串写到一个文档里面,UltraEdit.document[0] 表示的是UE打开窗口中的第一个窗口。请看程序:

UltraEdit.activeDocument.top(); //把光标移至文本的最顶端

UltraEdit.activeDocument.findReplace.regExp = true;  //使用正则表达式查找
var str_f = "^test"; //要搜索的字符串:行首的"test"
var cnt1 = 0; //个数统计
var line;

UltraEdit.activeDocument.findReplace.find(str_f);  //查找字符串 str_f

while (UltraEdit.activeDocument.isFound()) //如果找到要查询的字符串,则执行下面程序
{
    cnt1 = cnt1 + 1;
    UltraEdit.activeDocument.selectLine();
    line = UltraEdit.activeDocument.selection;
        UltraEdit.document[0].write(line);
    UltraEdit.activeDocument.findReplace.find(str_f); //再一次查找

附注:

1. UE按名称排序,正常情况下,我会用一个日期命名的文件作为当日的临时文件,其他的都是字母命名,每次打开当日临时文件都是排在第一个,也方便查找每天工作的文本记录。

2. 脚本使用帮助参见UE Help“入门->脚本命令”。

3. UE虽然支持脚本,但暂时还没有调试功能,这个很让人郁闷。暂时我也还没想到太好的办法,只能是靠经验了。

4. 正则表达式问题,或许以后我会另写一篇,希望有人支持!

你可能感兴趣的:(2-Web前端开发技术)