您的位置:首页 > 编程语言

代码阅读工具:Source Navigator和Source Insight

2011-09-12 14:20 295 查看
(摘自http://fky168.blog.163.com/blog/static/3786097200831033957620/

一、Source Insight实用技巧:

Source Insight(下文的SI指的也是它)就是这样的一个东西:

  Windows下开发人员的至爱,功能强大,界面友好。支持语法高亮、符号跳转,还支持函数调用关系图显示。这是一个专业的编程环境,很多大公司都是使用它的。这个编辑器除支持完善的自定义功能外,几乎所有配置都能作个性化配置。除此之外,它本身带有一套功能强大的宏语言(Macro Language),借助这种语言可以很方便的编程实现各种特殊功能,非一般编辑器所能比拟。查找功能支持得也很不错。虽然在工程较大时,查找起来有点慢。但是它除了一般编辑器所支持的普通字符串查找、正则表达式查找外,还能支持关键字查找-这种方式比前两者快得多,也算是一个弥补。不足之处是列模式较弱,对中文支持有缺陷。

显然,它也像其它任何东西一样的,同时具有优点和缺点的本性的,究竟如何,且听我一一道来。

官网下载:http://www.sourceinsight.com/down35.html

序列号(Serial):(任选其一)

SI3US-279028-11281

SI3US-772862-51931

SI3US-465643-84290

SI3US-176526-66007

SI3US-060062-28251

1  开胃菜-初级应用

1.1  选择美丽的界面享受工作

虽然不能以貌取人,但似乎从来没有人责备以貌取软件的。SI的华丽界面,绝对符合现代花花世界的人的审美趣味。在SI中,我们可以轻松地把各种类型关键字、变量、标志符、函数、宏、注释等定义为不同的颜色和显示方式(正体或斜体、加粗或正常、加下划线、放大显示等),总有一种方式能让我们一眼就能分辨出这个标识是什么。

1.1.1  字体选择

在SI中样式是可以被继承,如果要从根本上改变字体,最简单的方式就是直接修改根样式中的字体,因为其它样式都会由此继承而来。选择Options/Document Options页面内的Font Options中的Screen Fonts字体,即可改变根样式中的字体。SI中的默认配置为Verdana字体,是一种非等宽字体 2 ,为了使编写的代码在各种编辑器中看起来都有良好的对齐效果,这里强烈建议使用等宽字体,Courier、New
Courier和宋体等都是较好的选择。

1.1.2  颜色定义

毕竟这是见仁见智的东西,所以从来没有统一的标准3。很多人并不喜欢SI提供的默认配置,那么我们就改吧。选择Options/Style Properties页面,就可以在其中修改所有样式了。选择等号(=)表示继承Parent Style,也可以选择Pick(或者ON/OFF等)去配置一个新值。这完全视乎个人喜好。

1.1.3  标识符样式选择

在与 颜色定义 一节同样的界面内即可完成此项配置。

1.1.4  背景色选择

在希望要改变背景色的窗口点击鼠标右键(假定使用的是右手鼠标 4),选择上下文菜单的 xxx Window Properties项,然后点击弹出窗口的Back Color按钮,即可修改该窗口背景色。对于SI的源码主窗口,只需选择上下文菜单的Special
Window Color项即可完成背景色修改。

1.2  配置合理的默认值高效工作

1.2.1  使用合理的缩进

我始终认为最容易获得认同的是关于这个选项的配置了。选择Options/Document Options页面,点击其内的Auto Indent按钮,在弹出的Auto Indenting窗口中,默认配置为 Auto Indent Type选择Smart,且勾选了Smart Indent Options中的两个可选项,这样得到的默认缩进效果为
    while (1)
        {
        I
        }


每次都要手工去调整其缩进,其实只要把两个勾选项去掉,就可以得到
    while (1)
    {
        I
    }


何乐而不为呢?

1.2.2  显示坐标

通常情况下在窗口状态栏左下方,最会显示当前光标所在行列信息,但我总觉得不够明显,于是通常我们作如下配置:

选择Options/Document Options页面,勾选其中的Show line numbers。同时勾选其中的Show right margin,我们就可显示一条右边界,随时提醒我们是否该行代码写得过长了。

1.3  创建便捷的快捷键快乐工作

1.3.1  几个较常用的快捷键

默认情况下,SI已经定义了很多非常实用的快捷键:
F5

指定行号,实现行跳转,在遇到编译错误的时候,能特别方便的找到出错行。

Shift+F8

高亮显示指定标识,快速浏览标识的使用情况。

Ctrl+鼠标点击标识

直接跳转至标识定义处。

Ctrl+F

本文件内查找。

F3

本文件查找结果的上一个。

F4

本文件查找结果的下一个。

F7

打开Browse Project Symbols窗口,快速浏览工程内标识定义。

Ctrl+M

创建或查找书签,方便下次找回此位置。

1.3.2  自定义快捷健

选择Options/Key Assignments,在弹出的Key Assignments窗口中可自由添加自己喜欢的快捷键。比较值得推荐的有如下几个快捷键定义:
Edit: Drag Line Down

光标当前行下移。

Edit: Drag Line Up

光标当前行下移。

Edit: Join Lines

当前行和下一行连接成一行。

1.3.3  更多的快捷键

如果你正好对SI的Marco语言(下文将会介绍)有研究,那么还可以定义更多有用的快捷键,比如添加文件头、函数头、注释等(下文在介绍Marco语言时会介绍如何实现)。

2  小技巧-中级应用

2.1  查找与替换

在SI中支持多种查找及替换方式,除了上文提到的文件内查找外,还支持工程范围内查找、目录查找、指定多文件查找等等。

2.1.1  查找

Loopup References

我们最常用的一种查找方式是选择Search/Lookup References或按Ctrl+/组合键再或者鼠标点  R 按钮,在弹出的Loopup References窗口进行查找操作。

在Search Method中有四种可选的查找方式:Simple String、Regular Expression、 Keyword Expression和Look Up Reference。其中Simple String是最普通的查找方式,可以查找文件中出现的任意字符或字符,甚至可以查找 _upap || u 这样的字符串,但是在工程较大时,查找过程会较慢。

Regular Expression查找方式将在后面讲述正则表达时会介绍到,这里暂时按下不表。

Keyword Expression和Look Up Reference查找的结果基本相同,但是显示方式略有差异。这两种方式都是使用SI预先建立的数据库,查找起来速度相当快。但通常这种速度只对在查找标识符时有明显效果。对于像函数名,变量名等的查找,强烈建议使用这两种方式进行查找。

Search Files

选择Search/Search Files或按Ctrl+Shift+F组合键,在弹出的Search Files窗口进行查找操作。

在File Name框中可以填入文件名或文件夹。注意当要查询的文件夹双包含子文件夹时,可以勾选Options中的Include Subdirectiories,实现对各层文件的递归搜索。

Search Project

选择Search/Search Project,在弹出的Search Project窗口进行查找操作。操作与Loopup References几乎完全一致,它们各自保存上次搜索的配置。

2.1.2  替换
单文件替换

选择Search/Replace或按Ctrl+H组合键,在弹出的Replace窗口进行查找操作。在Search项目里勾选Selection则仅对当前选中的文档部分进行替换。另外如果勾选了Confirm Replacements则是逐个确认替换,否则会同时替换所有符合替换条件内容。

多文件替换

选择Search/Replace Files或按Ctrl+Shift+H组合键,在弹出的Replace Files 窗口进行查找操作。除了增加New框(替换后的内容)外,其余均与Search Files窗口相同,可参照查找部分的说明进行操作。

2.2  列操作

虽然开篇时就说过,SI的列操作功能比较弱,但不等于没有。先按下Alt键,接着就可用鼠标进行列选择,然后就可以删除指定的列。

2.3  无名技巧

这里介绍一些小技巧,大多数情况下我们可以无视它们的存在。但如果我们知道这些,某些时候,会有效提高工作效率。
Smart Rename

在上下文件菜单中选Smart Rename或按Ctrl+'组合键,即可弹出Smart Rename窗口。它有很强大的功能,但最便捷的使用方式是更改函数内局部变量的名字,操作只作用于函数内部,速度非常快。

Renumber

使用Ctrl+R将弹出Renumber窗口,这个用于处理数字顺序排列的情况相当有效,比如数组下标。例如现有代码
    array[0] = 1;
    array[1] = 2;
    array[2] = 3;

现在要改为
    array[0] = 0;
    array[1] = 1;
    array[2] = 2;
    array[3] = 3;

当然可以一个个修改,但最快的方式是在array[0] = 1;之前添加array[0] = 0;,然后列选数组下标,使用Renumber功能以 0为起始值重填数值。

Edit Condition

很多代码尤其是驱动代码,当中有大量的预编译定义,以实现对不同硬件配置的支持。在阅读这样的代码时最痛苦的是不能简单判断程序实际执行的代码分枝。大量分枝同时存在,常常会混淆我们的视听。比如对于下面的代码:
    #ifdef DEV1
        /* DEV1代码代码 */
    #else
        /* 其它设备执行代码 */
    #endif

如果确定我们当前分析的是DEV1的执行情况 5,那么可以选择上下文件菜单的Edit Condition 选项,在弹出的Conditional Parsing窗口中把DEV1的值设置为True,那么 #ifdef DEV1就等价于#if 1了,相当注释掉了#else分枝的代码。反之,设置为Flase时,则注释掉#ifdef
DEV1分枝的代码。

3  学会偷懒-高级应用

4  附录1-SI中正则表达式

由于在查找及替换中,经常会使用用正则表达式6,这里对SI的正则表达式进行简单介绍。

4.1  通配符
正则表达式通配符总表:

CharacterMatches
^ (在表达式开始处)行的开始部分
.任意单个字符
[abc]任意属于集合 abc 的单个字符
[^abc]任意不属于集合 abc 的单个字符
*前面字符的0个或多个重复
+前面字符的1个或多个重复
\t一个 tab 字符
\s一个空格符
\w一个空白符(包括 tab 符和空格符)
$行的结束部分
4.2  表达式中的组

在执行替换操作时,组将大有用武之地。正则表达式的各个部分可以用\(和\)进行分隔,分隔得到的每一项就是一个组。在进行替换时可通过组从匹配内容中抽取出特定串。在正则表达式中每个组都有一个编号,自左至右编号从1开始。

例如:abc\(xyx\)将能匹配 abcxyz ,此时组1就包含了 xyz 串。在进行替换操作时,就可以通过在替换后内容框中填入\1来取出这个字符串。推而广之,可以使用\<number>来取得组<number>所包含的串。

例如:当设定把\(abc\)\(xyz\)替换为\2\1的替换规则时,对于 abcxyz 被替换串,则组1包含 abc,组2包含 xyz,而替换后的内容定义为组2内容后跟组1内容(\2\1),因此将得到 xyzabc。

    举个真实的使用例子,相信会增加大家的兴趣。有时为方便调试,代码中到处流浪着各种形式的mytrace调用
    mytrace("Create parameter list... ");


 有时希望把它们全部注释掉,而有些时候又希望把它们全部恢复回来。这是个简单的例子,可以使用
    ^\(.*\)\(/\*\)\(.*mytrace.*\)\(\*/\)___FCKpd___6nbsp;==> \1\3


把它们恢复回来,而使用
    ^\(.*\)\(mytrace\)\(.*\)___FCKpd___7nbsp;==> \1/*\2\3*/


则完成把它们全部注释掉。

5  附录2-SI中的宏语言

我始终认为这是SI中最有趣的部分,这是一种功能强大的编程语言,几乎可以实现在编程过程可能使用到的各种功能。 这里不准备对如何实用宏语言进行编程作介绍(可参阅SI帮助文档。),只介绍如何使用已编好程序。为方便使用,我已把这些程序都集中放在utils.em文件中,下文就此文件进行论述。

该宏文件实现了一些在编码过程中可能会用到的功能, 如添加文件头、函数说明(使用时能自动添加文件名、函数名和当前日期)和宏定义,代码补全等。 使用说明:

(1) Project/Open Project...

打开Base工程(该工程一般在"我的文档/Source Insight/Projects/Base"中);

(2) Project/Add and Remove Project Files...

加入宏文件(即utils.em);

(3) Options/Menu Assignments

打开Menu Assignments窗口,在Command中输入Macro,选中要使用的宏,添加到合适的菜单中.

推荐使用的宏:InsFileHeader、InsFunHeader、InsHeaderDef、InsIfdef和AutoExpand (为代码自动补全功能,建议建快捷键)。

关于AutoExpand的举例说明, 当你输入了 switch 且光标正处于switch后面,运行该宏则会得到
    switch (###)
    {
    case
        break;
    default:
    }


对于InsFunHeader宏,如果有如下函数体

    int nOpenConfigFile(char *pchMemConfig, char *pchFlashConfig,

        int nSize, int nMode)

    {

        I

    }

光标在函数体内时运行该宏,那么将会在函数体上方得到

/******************************************************************************

 * nOpenConfigFile -

 * DESCRIPTION:-

 *

 * Input:   N/A

 * Output:  N/A

 * Returns: N/A

 *

 * modification history

 * --------------------

 * 1.00, Apr 19, 2007, T357 written.

 * --------------------

 ******************************************************************************/

其中的函数名及编写日期自动按实际情况填充,T357串可通过修改utils.em文件,改成你需要的名字。

6  附录3-推荐格式

所谓人各有志,这里就不说啦。

7  结束

至此,已将我所知的所有关于Source Insight(未包括其附带的Macro语言)知识在此文档中描述出来。

如有错漏,请指正。

二、源代码查看工具 Source Navigator 使用心得

Source Navigator 是Red Hat出品的一款查看源代码的工具,非常好用,与Windows下的Source Insight有一敌。但是它的界面不怎么好看,用的不是GTK图形库,所以界面风格与Gnome不一致,操作上也有些不同。除了这些,其它功能都非常强大,细数如下。里面的一些简写约定如下:
 
Code Area
 
clClasses
conConstants
eEnums
ecEnum Values
fdFunction Declarations
frfriends
fuFunctions
gvGlobal Variables
ivInstance Variables
maMacros
mdMethod Definitions
miMethod Implementations
tTypedefs
unUnions
lvLocal variables
udUndefined
 
Cross-Reference
 
rRead
wWritten
pPassed
uUnused
SNav的代码窗口有6个标签页,它们分别是

“Edit”

“Hierarchy”

“Class”

“Xref”

“Retriever”

“Grep”其中,“Edit”区是代码显示和修改的区域,是工作的主要区域;“Hierarchy”和“Class”是C++代码的组织工具;“Xref”是最强大的一个工具,它会把一个函数中的所有用到的变量,调用的函数,用到的结构全记录并展现出来;“Retriever”也是一个非常有用的工具,用于把一个库代码包中的所有定义的符号列出来,并记录相应的属性;“Grep”用于查找某一个符号,可指定搜索的范围,既可全局查找也可部分文件查找。阅读代码时常用到的一些键值组合:

Ctrl+leftarrow | rightarrow | uparrow | downarrow 以词的形式移动光标

Ctrl+Alt+leftarrow | rightarrow | uparrow | downarrow 以词的形式移动光标并选择走过的区域

Ctrl+Shift+D 查看选定符号的声明

Ctrl+Shift+I 查看选定符号的定义代码窗口的工具栏上有7个元素,分别是

“回退跳转”

“前进跳转”

“光标处所在的函数名或结构名”

“选定并要操作(比如查找)的字符串”

“在本文件中查找选定的字符串”(比Ctrl+F查找功能好使)

“在整个工程中查找与选定字符串匹配的代码”

“在整个工程中以Grep的方式查找与选定字符串匹配的代码”(会跳到Grep标签页中显示结果)注意:snavigator在导入目录时,目录名中间不能出现空格。

三、在ubuntu中安装 Source-Navigator及使用手册 

2009-09-25 23:19 

from : http://hi.baidu.com/xiaohu_tiger/blog/item/66d207888431d6b40f2444ec.html

1 通过apt-get安装(版本较旧) 

安装命令:sudo apt-get install sourcenav 

启动命令:snavigator

2 手动安装最新版本 

1)到官方网站获取软件包 
http://sourceforge.net/project/showfiles.php?group_id=51180 

2)解压缩 

tar zxvf s ourcenav-6.0.tar.gz 

./configure --prefix=/opt/sourcenav (install 文件推荐参数) 

make 

make install 

ps:如果出现权限问题,前面加sudo 

3)如果碰到下述错误 

/root/tk8.4.16/unix/../generic/tk3d.c:1279: error: ‘TkBorder’ has no member named ‘resourceRefCount’ 

/root/tk8.4.16/unix/../generic/tk3d.c:1280: error: ‘Tk_FakeWin’ has no member named ‘display’ 

/root/tk8.4.16/unix/../generic/tk3d.c:1280: error: ‘Tk_FakeWin’ has no member named ‘screenNum’ 

/root/tk8.4.16/unix/../generic/tk3d.c:1280: error: ‘TkBorder’ has no member named ‘screen’ 

/root/tk8.4.16/unix/../generic/tk3d.c:1281: error: ‘Tk_FakeWin’ has no member named ‘atts’ 

/root/tk8.4.16/unix/../generic/tk3d.c:1281: error: ‘TkBorder’ has no member named ‘colormap’ 

/root/tk8.4.16/unix/../generic/tk3d.c:1301: error: ‘TkDisplay’ has no member named ‘borderTable’ 

/root/tk8.4.16/unix/../generic/tk3d.c:1301: error: ‘TkDisplay’ has no member named ‘borderTable’ 

/root/tk8.4.16/unix/../generic/tk3d.c:1306: error: ‘TkBorder’ has no member named ‘nextPtr’ 

。。。。。。 

则在终端是输入:sudo apt-get install libx11-dev 

4) 启动snavigator 

在终端直接输入:snavigator 

5) 使用手册(user manual) 
http://sourcenav.sourceforge.net/online-docs/userguide/index_ug.html 

还有一个 source insight 和source navigator的比较的帖子: 
http://fky168.blog.163.com/blog/static/3786097200831033957620/

======================================================== 

运行source navigator的问题 

方法一、(转载) 

安装完成后运行 snavigator 提示 

[root@MagicLinux sourcenav-6.0]# snavigator 

Can't find a usable tk.tcl in the following directories: 

/usr/local/share/tk8.3

/usr/local/share/tk8.3/tk.tcl: no event type or button # or keysym 

no event type or button # or keysym 

while executing 

"bind Listbox <MouseWheel> { 

%W yview scroll [expr {- (%D / 120) * 4}] units 

}" 

(file "/usr/local/share/tk8.3/listbox.tcl" line 182) 

invoked from within 

"source [file join $tk_library listbox.tcl]" 

invoked from within 

"if {[string compare $tcl_platform(platform) "macintosh"] && \ 

[string compare {} $tk_library]} { 

source [file join $tk_library button.tcl] 

so..." 

(file "/usr/local/share/tk8.3/tk.tcl" line 30 

invoked from within 

"source /usr/local/share/tk8.3/tk.tcl" 

("uplevel" body line 1) 

invoked from within 

"uplevel \#0 [list source $file]"

This probably means that tk wasn't installed properly.

不知其所以然,重新安装tk8.3无效,升级到tk8.5无效

后来在网上发现需要给下载的Source-Navigator 6.0打补丁 

http://bugs.gentoo.org/show_bug.cgi?id=225999 找到 tk-8.4-lastevent.patch 补丁 

将补丁粘贴到source navigator 源码目录 sourcenav-6.0/tk目录下,再cd 到sourcenav-6.0/ tk 的源码目录 

patch -p0 -i tk-8.4-lastevent.patch 

删除安装,重新安装,可以运行了(我试了一下不行)。

方法二、(转载) 

有找到解法: 

(http://forums.fedoraforum.org/showthread.php?t=213441

註掉 lines 182-184 in the file /opt/sourcenav/share/tk8.3/listbox.tcl 

註掉 lines 457-459 in the file /opt/sourcenav/share/tk8.3/text.tcl

在panel中添加Launcher,在Command中添加/opt/sourcenav/bin/snavigator

====== 安裝完後在桌面增加捷徑的方法 ====== 

我要做捷徑的目標是/opt/sourcenav/bin/snavigator (這是個sh script) 

裡面要改一行 

#snbindir=`dirname $0` 

snbindir=/opt/sourcenav/bin 

這樣再建一個捷徑到桌面即可: 

ln -s /opt/sourcenav/bin/snavigator ~/Desktop/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息