终于忍不住了,要为Megax加上语法加亮,我在正则还是lex上徘徊了大半年,始终没有找到比较好的方法,一个编辑器如果支持非常严格的语法加亮的话,那么可配置性是相当的差的。像scintilla,你必须得写个lex针对某种特定的语言才行。当然大多数的语言都有一些共性,比如你可以用c语言的语法文件去渲染java或者c#的。但是我不想这么做,我想要傻瓜也可以进行配置文件的编写,像Editplus,但是Editplus做的不够好。
目前完成了块状代码的识别,这是最关键的,什么是块状的呢,主要是下面这三种:
1.注释(单行,多行)
2.字符串(可续行或者不可)
3.子语言
对于子语言这一块,c++里面可以嵌入asm,html里面可以嵌入css和js,像这样的语言,我把它定义成子语言。但是子语言不可嵌套,在Megax里面我不处理嵌套的子语言(PS:谁他妈的有病啊,这么写)。
完成上面这些,在遇到子语言的时候,只需要切换当前的schema就可以完成子语言的语法加亮,同时Megax定死了,最多支持4种sub language.
识别完之后,在用正则分别进行细节匹配,比如c++里面里面的#[多个空格]include和#[无空格]include都是关键字,或者注释里面含有email地址之类的。
在进行行跳转的时候,我们不需要识别这些,只需要识别块状的代码,所以效率是非常的高,在我的机器上打开100万行的代码,跳转到任意一行,均十分的流畅。
先写这么多了,下面这张截图暂时没有子语言的支持,上班时间偷偷写的啊。
另外高速自动换行基本实现了,效率和内存占用让我很满意,基本上没有明显的延迟,小胜Editplus。
最近下了EMEditor的最新版本,EM做的是越来越强大了,基础功能和架构我觉得应该是目前最棒的编辑器。在打开超大文件的时候,用内存映射之后,剩下的内存占用主要是行信息。在编辑的时候,我一直认为内存映射会非常的慢,看来我需要重新审视一下。思路就是这样的,EM加载大文件的时候会启动一个新的线程,线程的同步着实是个大问题,不是我擅长的啊。。。。
周四回国了,好高兴,回去要大吃一顿,想死我了。
posted on 2008-06-23 18:17
megax 阅读(1981)
评论(4) 编辑 收藏 引用