Ultraedit高级应用(1) - 快速生成远程工程

由于目前我从事的开发工作只能在Unix上编译和测试,开发人员一般都习惯于在Windows下使用Ultraedit(以下简称UE)编辑代码,然后再FTP上传,这注定了IDE将与我们无缘。在无比怀念Eclipse、Visual Studio的同时,我尝试了很多Windows下优秀的C++开发工具,不断地比较和取舍后最终还是回归了UE。
UE曾经是16进制编辑器的代名词,强大的列编辑模式目前也无人能及,多年的演进让它的功能丰富了到让人望而生畏(想想那一屏高的右键菜单),幸好它还拥有着同样强大的可定制性。经过一番配置和二次开发后,现在我开发后台已经颇为顺手,下面介绍一下我的定制过程,均基于我当前在用的v15.10.0.1028版本。

我的开发方式要求我们的工具要有远程编辑功能;为了方便,我还希望能以目录树的方式,随选随改;工作的网络环境不是很理想,希望切换远程目录时不会停顿;我的编辑仅限于代码文件,不希望编译过程中产生的中间文件(包括中间代码文件)干扰我的视线。在我尝试过的众多文本编辑器和IDE中,只有UE优雅地解决了这些问题。

UE中的工程同时支持本地文件和远程文件,支持多层虚目录,只须将FTP上的源文件组织成一个工程,即可快速编辑,文件也可以保持原来的目录层次,避免了FTP方式的频繁加载目录和中间文件的干扰。

我的工作可能涉及5个子系统,近200个模块,将这些模块人工组织成UE工程明显不现实。研究工程文件发现,一个工程共分为3部分,头部是格式声明,然后是目录层次,最后是每个目录下的文件全路径,如下:
[Project ID]
Signature=UE Proj: v.1
[Project Information]
Use Relative Directory=1
Relative to Project File=1
[Group]
0=busiaccep_svr
1=busiaccep_svr - busicompleteintfmgr
2=busiaccep_svr - busicompleteintfmgr - kernel
3=busiaccep_svr - busicompleteintfmgr - include
4=busiaccep_svr - busicompleteintfmgr – mgr
……
[Files - busiaccep_svr - busicompleteintfmgr - kernel]
0=FTP::182ng/home/blahblahblah/busiaccep_svr/busicompleteintfmgr/kernel|interfaceip_db.obd
1=FTP::182ng/home/blahblahblah/busiaccep_svr/busicompleteintfmgr/kernel|public_intf_db.obd
2=FTP::182ng/home/blahblahblah/busiaccep_svr/busicompleteintfmgr/kernel|Makefile
[Files - busiaccep_svr - busicompleteintfmgr - include]
0=FTP::182ng/home/blahblahblah/busiaccep_svr/busicompleteintfmgr/include|IUserProm_mgr.h
1=FTP::182ng/home/blahblahblah/busiaccep_svr/busicompleteintfmgr/include|IUserCell_mgr.h
……
这应该可以写一个Shell脚本,遍历UNIX上的源代码目录,生成项目文件,下载到Windows中用UE打开,最终证实是可行的。脚本如下:

#!/bin/ksh

#

根据当前目录生成UltraEdit工程文件内容

将生成的内容存储为.prj文件, 即可作为UE工程打开

#

caijw 创建 2009-5-6 13:50:30

#

参数

FILTER=”Makefile .c .cpp .h”
FTP_LINK=”182ng”
CUR_PATH=pwd

生成项目头部信息

echo “[Project ID]”
echo “Signature=UE Proj: v.1”
echo “[Project Information]”
echo “Use Relative Directory=1”
echo “Relative to Project File=1”

生成目录结构信息

echo “[Group]”
find . -type d | egrep -v /CVS$ | egrep -v .svn | egrep -v ^.$ | awk -F”/“ ‘{print NR-1”=”substr($0, 3)}’ | sed ‘s/// - /g’

生成文件列表

find . -type f | egrep -v /CVS/ | egrep -v /.svn/ | egrep -v ^.$ | awk ‘{print substr($0, 2)}’ | awk ‘
BEGIN{
FS=”/“;
LAST_PATH=”/DEV/NULL”;
FILE_IDX = 0;
}
{
SCAN_PATH = substr($0, 0, last_index($0, “/“) - 1);
UE_PATH=SCAN_PATH;
gsub(“/“, “ - “, UE_PATH);

if(SCAN_PATH != LAST_PATH) {
    print "[Files"UE_PATH"]";
    LAST_PATH = SCAN_PATH;
    FILE_IDX = 0;
}

print FILE_IDX"=FTP::'$FTP_LINK''${CUR_PATH}'"SCAN_PATH"|"$NF;

FILE_IDX++;

}

#

查找某字符串在另一字符中出现的最后一次位置

#
function last_index(strsrc, strsub){
idx = index(strsrc, strsub);
if (idx != 0){
return idx + last_index(substr(strsrc, idx + 1), strsub);
}else{
return 0;
}
}

完成

使用前修改脚本内容,将FTP_LINK=”182ng”中的182ng修改为UE中FTP的连接名称。建议名称尽量短小,以减少最终生成的项目文件的体积。

将脚本文件放到代码的最上级目录,执行chmod +x ue_prj.sh添加可执行权限,执行ue_prj.sh > openboss.prj,即可生成该目录下所有文件组织成的UE工程,下载至Windows中即可用UE打开,效果如下:

UE打开工程

注意:

  • 生成项目前先up一下代码,保证生成的项目是最新的
  • 对曾经编译的模块,最好gmake clean_all一次,避免中间文件也加入项目中