修改Slickedit 2007的Preview窗体布局


Slickedit 2007的Preview(相当于之前的Symbol窗口)布局实在是有点BT,没有双显示器或者是高分辨率宽屏的人消受不起。所以我装了以后立马给它改了布局干掉了那个基本上没有什么实际需要的符号文档区(因为鼠标放上去就有显示何必要预览?),使其适合Dock在界面下方节省空间。

实际上修改的办法实在是极其简单,我仅仅是对换了代码区和文档区而已。所以变成文档区到下面了代码区跑到列表右边。当然,还需要再把中间的横向分隔条向下拉到底,就成了现在这个样子:

具体方法如下:

  1. 输入命令:open-form _tbtagwin_form
  2. 在控件属性窗口里面把edit1控件和ctltagdocs控件的位置属性统统对调(就是x,y,width,height这几个)
  3. 打开tagwin.e文件,找到resizeTagWin函数,把里面所有的ctltagdocs和edit1对调
  4. 把ctl_size_x.lbutton_down()和ctl_size_y.lbutton_down()两个函数里面的ctltagdocs和edit1也对调
  5. 重新load tagwin.e,然后重启Slickedit 2007
  6. 把Preview窗口的横向分隔条拉到最下面,搞定!

不过这里给正在打算升级到Slickedit 2007的人提醒一下~~我以前在我的Blog里面关于Slickedit的其他文章里面提到过如果不是那种不用最新的不爽的人一般不要去随便升级到Slickedit的最新主版本。因为根据我的经验,Slickedit的第一个Release版本通常Buggy(10.0.0真是登峰造极了,经常崩掉)。一般都是要到下一个Release才是真的好用的(比如10.0.1就马上狂稳定了)。这次2007的也不例外,我已经提了不少BUG上去了,光光一个Files Tool Window我就找到了4个BUG(─.─||)。所以不是很有升级欲望的同学还是等到12.0.1出来以后再出手。另外之前的11.0.2确实是一个不错的版本,稳定性和功能俱佳。

为SlickEdit 2007的Files Tool Window增加新的快速前缀查找法


在我之前关于Slickedit 2007使用体会的文章中提到了SE 2007这个在大文件的时候慢得出奇的Files Tool Window。下面就是给出我对他的修改以解决这个问题。如果你经常用SE来分析文件数目超过1w个的大型项目的话,这个修改基本是必须的。

修改步骤如下:

1. 打开tbfilelist.e,在里面添加这样一个函数:

static void FileListPrefixFiles(_str filter_re)
{ // for each node under this category index := _TreeGetFirstChildIndex(TREE_ROOT_INDEX);

/* Force sort by Filename */ _TreeSortCol(0, 'F');

while (index > 0) { // get just the file name with path filename := _TreeGetCaption(index); parse filename with filename "t" . "t" .; if (filename >= filter_re) { int lineNum = 0; _TreeSelectLine(index, true); _TreeSetCurIndex(index); _TreeGetInfo(index, 0, 0, 0, 0, lineNum); _TreeScroll(lineNum); break; } // get next file node index = _TreeGetNextSiblingIndex(index); } }

这段函数就是我实现的和古典的project-load命令相同的前缀查找方式。这种方式不对列表进行过滤,仅仅是将列表强制进行文件名排序后跳转到最长前缀匹配的文件名处。至少在1.5w个文件的Linux Kernel项目的测试中,这个函数的查找速度能跟得上在Filter输入框中的输入速度。

2. 找到“void ctl_filter.on_change(int reason=CHANGE_OTHER)”这个函数,修改如下:

void ctl_filter.on_change(int reason=CHANGE_OTHER)
{ if (_GetDialogInfoHt("oldtext",ctl_file_list) != p_text) { int wid=getCurrentTreeWID(); if ( wid ) { if (wid._TreeGetNumChildren(TREE_ROOT_INDEX) > 5000) { wid.FileListPrefixFiles(p_text); } else { wid.FileListFilterFiles(p_text, (def_filelist_options&FILELIST_PREFIX_MATCH) ); } _SetDialogInfoHt("oldtext",p_text,ctl_file_list); } } }

这段修改是让Slickedit在Files Tool Window中文件数目超过5000个的时候就启用上面这种简单但是快速的查找方式。5000这个数可以自己修改成适应自己机器状况的最佳值。

3. 重新load tbfilelist.e,马上就生效。

另外tbfilelist.e有个地方有个小bug:找到“static void getColWidths(_str &col_widths)”这个函数。看到里面的for循环~~_TreeGetColButtonInfo第一个参数应该改成“i”。否则用0的话结果就是还原Files Tool Window后所有的List Column宽度都会和第一列(Name)相同~~这个bug着实弱智了点(─.─||)。

Slickedit 2007初步使用体会


前天Slickedit 2007版(实际上就是v12)发布,昨天晚上弄到以后就开始了漫长的安装和体验过程。Slickedit 2007版本可以说是采纳了不少用户意见(当然也包括我的了(# ̄▽ ̄#)),增加了一些实用的功能。不过话又说回来新增加的功能中也带来一些麻烦,尤其是我原先寄予厚望的File List和Symbol Preview。不过在我对其代码进行了一番修改以后,已经用起来感觉不错了。

简单试用了一个晚上后,感觉Slickedit 2007相对于Slickedit 11.x来说,主要增加了如下新特性。

Project Add Tree增加黑名单:

小小的改进,不过在添加文件的时候要方便很多。使用黑名单可以过滤由某些无用文件或者自动生成的文件。

大大增强的Find Symbol功能:

原先v11的Find Symbol并不是很好用(相当于SourceInsight的F7功能)。2007中Slickedit对这点做了很大改进:首先Find Symbol窗口可以Dock,用起来非常方便;其次搜索功能及其强大。

Find Symbol支持前缀匹配和子串匹配查找(SourceInsight和原来的Slickedit用的最土的一种),Pattern查找(非常强大,可以支持正则表达式和通配符)。我一般就是习惯用通配符形式的Pattern查找因为我的正则很少用没法做快速反应(─.─||)。不过大多数时候有个通配符也就足够了。上图就是使用通配符查找的结果。

在查找范围上,可以选择查找的Tag库(比如当前WorkSpace或者是包含编译器的库文件等等),查找的Symbol范围(如仅仅是函数名或者是全局变量等)。总之用起来没有什么意见了。

File List功能(★):

打五角星的表示是采纳俺滴意见滴(^▽^)。我极力向Slickedit作者推销了SourceInsight的File List半天终于有了结果:Slickedit上面也出现了这样的东西。虽然还远没有到达完美的地步(后来我通过修改代码解决),但是比起v11和之前的弱智Project Load窗口来说,实在是个不小的改进。

2007的File List已经和SourceInsight一样是可以Dock在窗体内方便随时使用了。File List有三种模式:当前打开的文件列表、Project文件列表和WorkSpace文件列表。我一般都是使用WorkSpace列表模式。

这个File List用起来和SourceInsight的很像了,支持列表过滤(即查找时仅显示符合匹配条件的文件)。文件查找的过滤条件支持前缀匹配和子串符匹配两种(两者可以切换,用前缀匹配速度快):

值得一题的是无论是子串匹配还是前缀匹配都能支持通配符。前缀匹配似乎是只能支持“?”通配符,子串匹配支持“?*”两种。上图为使用子串匹配+通配符查找的效果,印象中似乎SourceInsight只能支持子串匹配不支持通配符?另外Slickedit的开发者说这回的File List内项目都有Cache,所以不会出现老版本每次打开大型项目的Project Load窗口的时候那好几秒的痛苦等待。不过我后来使用Linux Kernel项目来测试的时候发现,这好几秒只是转嫁到了项目打开的时候去了。现在打开巨型Project的速度要比原来慢起码10秒以上~~不过这个巨型项目是指文件总数在1.5w以上这样的东西。对于通常的文件不超过5000个的项目来说则没有什么问题。但是每次加载工程等个10秒,总比每次呼出Project Load对话框等个10秒要好啊!

这个File List在使用中发现的一个实在是无法忍受的问题是在里面包含的文件非常多(比如Linux Kernel的1.5w多个文件)的时候,过滤效率就会变得极其缓慢。这主要是两个原因造成的:一个原因是他使用的通配符过滤速度本来就比较慢,每次必须扫描所有的文件名进行通配符比较处理;另一个最主要的原因是Slickedit自己实现的Tree List控件效率有问题。在里面的子项非常多的时候添加删除子项就会变慢。1.5w个文件项在实时过滤时不断添加移除的后果就是导致每在Filter里面输入或者删除一个字母都会带来长达10秒左右的延迟!!所以这个File List在分析Linux代码的时候就会令人忍无可忍了。

不过在分析了一下File List的实现以后,我已经完成了对File List的初步修改。目前我修改的File List在项目文件数小于5000个的时候(可能再大也可以,不过没有闲心去试验究竟这个水线用多大好),就会自动使用Slickedit默认的通配符方式的过滤器;如果文件数大于水线,则自动使用我另外实现的快速前缀匹配搜索方式(即和原来的Project Load的搜索方式完全相同,实际上最经常用的一般也是这种):

可以看到上面的File List已经使用了前缀匹配的查找方式:在查找时只是跳到前缀最长匹配的一个文件去,而并没有对文件列表进行过滤操作。所以无论是查找速度还是控件的操作(完全没有增加和删除的操作)都极大减小,速度也快了几个数量级~~在使用了这样的修改以后,寻找Linux Kernel工程内的代码文件速度简直和SourceInsight内的File List无异了,可以说是基本完美解决。不过这个问题我有空还是要去烦一把Slickedit的那帮家伙去~~

Symbol Preview(★):

我曾经在Slickedit论坛上贴了个把原来的Symbol Windows改装成类似SourceInsight那样的Symbol Preview,并对多Tag情况下的操作做了点改进的宏。Slickedit开发者看见了很感兴趣,表示会在新版本加入这个功能,现在在2007上面果然看到了。

原先的Symbol Window现在改名为Preview,主要功能就是对在任何地方选中的Symbol(比如Reference中、Find Symbol中……)进行预览;并且在出现重名Symbol的时候可以从列表中直接选择某个Symbol进行预览,非常方便(操作上已经远胜SourceInsight的Context Windows了)。但是Slickedit 2007默认的Preview窗口布局实在是令人难以习惯:那种布局只适合于放在窗体的右侧,除非你是有双显示器或者是高分辨率的宽屏显示器的话才会用到那样奢侈的布局。所以我又是一通修改,把Preview窗口的布局修改成了我上图的样子,这样就很容易Dock到窗体下面去了。

改进的文本渲染:

实际上文本渲染的改进简直微乎其微,和SourceInsight的花花绿绿大杂烩的渲染还是没什么可比性。不过经过了修改以后Slickedit的渲染终于到了可怜的UE的水平:Highlight的颜色设置仅仅会替换背景色不会再替换前景色了。所以这回可以放心启用行高亮功能了不会再出现原先一启用行高亮就会导致当前行的语法高亮消失的情况:

可以看到行高亮处的语法高亮的字体和颜色设置都保留了,仅仅是替换了背景色。这点上Slickedit终于在2007版达到了和其他编辑器一样的水平了(─.─||)。

另外一个功能是带语法高亮的Copy功能,支持RTF和HTML两种。如果用RTF,能够完美支持中文,但是只能支持很少量的几种颜色(RTF的限制);如果用HTML可以完美支持所有颜色,但是不支持中文(─.─||)~~实在是鱼与熊掌不可兼得啊。不过对于一般用英文写注释的我来说,不支持中文基本不算是什么问题。下面就是Copy一段代码贴近来的效果:

/* setup uart port, enable interrupt */
rtn = pq2_uart_port_setup(pq2_uart, true);
if (rtn != 0) {
DEBUGMSG("ERROR in pq2_uart_tty_init: Code %d, System halt...n", rtn);
machine_halt();
}

这段代码在Slickedit里面的显示效果上图可以看见。大家可以对比一下,效果比Eclipse的好了太多了。另外也支持将整个代码导出成带有语法高亮的HTML。

文件标签栏支持中键关闭(★):

同样出自我之前贴在Slickedit论坛上对原有bufftabs的mod,现在中键关闭功能也被集成到2007中。

带有跳转按钮的Symbol信息提示:

现在将鼠标放在Symbol上之后出现的信息提示栏中多了一个绿色的跳转按钮,点击即可直接跳转到这个Symbol的Definition处。阅读代码起来更加方便了:

文档:

Slickedit的Slick-C宏语言一直是令人垂涎三尺又难以接近的东西。一旦掌握Slick-C就可以让Slickedit释放潜在的强大功能发挥无比威力,但是没有一个像样的文档又很大制约了用户对Slick-C的掌握和应用。看来Slickedit的开发者从论坛上大家对mod和patch活动的热衷中发现了为用户提供良好的开发文档是对双方都大有好处的事情。所以这回在Slickedit的安装包中,终于看见了比较像样的Slick-C开发文档了。以后再对Slickedit修修补补什么的有了文档就方便的多。

其他:

其他还支持了诸如行标尺和Dynamic Surround这样的比较没什么用处的功能。不过挺有趣的大家可以玩玩试试。

全拼输入法的马甲


如果你用搜狗拼音或者拼音加加敲得和使用微软拼音输入法的家伙差不多快,那一点也不稀奇。但是如果你用全拼输入法敲得和微软拼音差不多快的时候,那么这就会对敌人造成心理上的严重打击。用全拼和人PK打字能够取得心理战的伟大胜利。

当然用全拼输入法可能只有比BT还要BT的家伙才能达到拿的出手的输入速度。但是如果用披着羊皮的搜狗的话,事情就很简单了。所以俺周末做了个能够达到99%全拼输入法仿真度的搜狗拼音输入法的Skin,以假乱真到足以被人当作是全拼神人来崇拜(# ̄▽ ̄#)。