Home » Blog » FlexEdit 脚本和多语言设计 |
首先要抱歉:要实现下面的功能得需要一段时间,工作很忙,后面可能要做个手术,又要耽误时间。作为这个软件的作者和铁杆用户,我会不断的在维持整体的简洁的前提下扩展功能。
春节仅完成了查找功能,很不彻底的那种: UTF8/UNICODE查找不支持,只增加了一个工具栏(内有停止查找、清除查找结果、已经显示当前在查找哪个文件),将原先的ANSI代码移植到UNICODE而已。
对于命令窗口,决定废弃新实现的windbg方式的(combo+view)方式,因为我想让命令行支持复杂的多行条件逻辑:比如for、if等等,起初我想使用微软的IActiveScript来实现类似coraldaw、office的vba脚本支持,后来查了很多资料,发现vbscript不是一个好的idea:
1. 不开源
2. 安全考虑? 出现word的宏病毒,这个好像flexedit还差一大截子用户群
3. 讨厌vbscript,这个可能是我的个人原因,或者这玩意没了真气(ms不搭理了)
为了找到替代的,翻出来了LUA(鲁鹅–山东烤鹅?),很多人高度评价了这个库,我06年好像用过,不过当初对这个库的理解是驴头对马嘴。看手册看文档看了3天,仅有的一些皮毛让我不敢去实现在FlexEdit中,所以打算先列个初步版本要实现的框子:
table:
tabset -> all tabs
editor -> a open file in tab
dir -> enumerate files in a dir
global function:
cls -> clear command window text
cd -> change directory
dir -> dump current directory files
open -> open a file in flexedit
color -> change command window background
run -> execute a command
h -> Dump help
print -> echo string
LUA简洁而又强大的功能,让我觉得即使添加LUA失败,也能长不少见识。下面是我想如何将LUA放到flexedit的细节:
1. 维持现有菜单,不增加单独的宏菜单
现有的主菜单是从100、200、…、900的,我不打算溢出到1000,而且现有的命令窗口可以很容易的扩展任何你想要的功能:比如增加一个单独的工具栏,其中放任何你想要的功能。
2. 工具命令发到命令窗口中执行
命令窗口中输入每个命令都是一段可执行的LUA脚本,使用enter或者ctrl+enter来控制是换行命令还是执行前面的命令。run内建命令用来执行发送过来的命令,并且将重定向的输出打印到command窗口中。
3. 宏脚本的录制
scintilla中最强大而又最容易让脚本头大的就是漫天飞舞的消息,比如删除某行、定位光标到某个位置、选择某个区域等等。为了方便,提供一个功能录制当前发送给活动窗口的scintilla消息。
还有时间允许,在来个录制所有的菜单的命令,那就完美了。比如:删除所有行尾空格、弹出当前文件属性对话框等等。
这样,以后用户只需要编写(录制为辅)脚本就能扩展scintilla,这个能够实现扩展非常强悍的功能,举个例子:
1. 使用dir来打开某个目录下所有的*.cpp;*.c;*.h的文件
2. 使用editor实现注释掉某个*.cpp文件中的前三行
3. 使用dir、editor实现将该目录以及所有子目录下的*.cpp;*.h文件添加版权信息
4. 使用dir和menucmd实现批处理将所有unix格式的代码转换位windows格式
还有对于多语言方面,非常感谢大家提的建议,很有价值,比如jsfaint的。为了平衡效率和功能,我必须使得整个流程简单、高效:
比如对于对话框,在OnInitDialog中调用某个函数,即可更新dialog上的文字。
对于菜单,最好采用LoadMenuIndirect来间接载入menu资源来创建,对于字符串,按照索引从小到大依次数组排列,内部直接依靠数组即可调用。
我先后想采用的三种方式:
1. xml方式
由于现在FlexEdit已经是UNICODE了,而且以后也会这样(ANSI版本彻底作古),所以使用xml就无法避免mbcs到unicode的转换,tinyxml(flexedit使用这个xml解析库)缺点是我得频繁的转换,而且最重要的是翻译者可能会不小心破坏了xml结构,xml不如ini那么顽强。而且xml有很多的转义字符,翻译者和我一样困惑。
2. .res方式
原先想直接公开flexedit.rc文件和resource.h文件,翻译者直接翻译,然后调用资源编译器rc.exe来生成一个资源dll,这个方法缺点和xml类似,还有一个就是翻译者要求比较高,而且步骤很婆婆妈妈。
3. ini方式
这是我目前想到的方式。对于对话框,使用dialogid来保存,每个段中保存所有这个dialog中的control id,每次使用GetPrivateProfileSection载入这个段中所有数据,然后依次解析每组数据,并在WM_INITDIALOG调用SetDialogItemText更新字体。
对于菜单,使用[menu]段,直接载入资源原始文件,更新之。
对于字符串,使用[string]段,其中索引是递增1排列,以便内部缓存后快速索引。
最终外围可能是创建一个mui目录,里面保存各种脚本,每种脚本以英文的语言名称来命名,比如:chinese simplified.ini,germany.ini来目录,为了保存翻译者以及版权信息,保留单独的[head]段,里面有:author/date/website/description。为了保证即使没有任何mui文件也能使用flexedit,flexedit内嵌一份英文res文件,用来作为模板。
最好,我想该放弃resedit(http://www.resedit.net/),因为这个工具每次会扰乱手动编辑的资源文件格式,原先想机器上彻底不安装VC也能编辑资源文件。现在能够替代的是redasm中的resed,能够忽略id字符串编辑对话框,这个好,完全没有必要去搭理id嘛,又不是编译,而且用户可以方便的自己用#define yyy xxx+n来定义优雅的结构。
Copyright © 2009 xuyibo.org All right reserved. |