Source Insight实用技巧.docx
《Source Insight实用技巧.docx》由会员分享,可在线阅读,更多相关《Source Insight实用技巧.docx(16页珍藏版)》请在冰豆网上搜索。
SourceInsight实用技巧
一、SourceInsight实用技巧:
SourceInsight(下文的SI指的也是它)就是这样的一个东西:
Windows下开发人员的至爱,功能强大,界面友好。
支持语法高亮、符号跳转,还支持函数调用关系图显示。
这是一个专业的编程环境,很多大公司都是使用它的。
这个编辑器除支持完善的自定义功能外,几乎所有配置都能作个性化配置。
除此之外,它本身带有一套功能强大的宏语言(MacroLanguage),借助这种语言可以很方便的编程实现各种特殊功能,非一般编辑器所能比拟。
查找功能支持得也很不错。
虽然在工程较大时,查找起来有点慢。
但是它除了一般编辑器所支持的普通字符串查找、正则表达式查找外,还能支持关键字查找-这种方式比前两者快得多,也算是一个弥补。
不足之处是列模式较弱,对中文支持有缺陷。
显然,它也像其它任何东西一样的,同时具有优点和缺点的本性的,究竟如何,且听我一一道来。
官网下载:
序列号(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/DocumentOptions页面内的FontOptions中的ScreenFonts字体,即可改变根样式中的字体。
SI中的默认配置为Verdana字体,是一种非等宽字体2,为了使编写的代码在各种编辑器中看起来都有良好的对齐效果,这里强烈建议使用等宽字体,Courier、NewCourier和宋体等都是较好的选择。
1.1.2?
?
颜色定义
毕竟这是见仁见智的东西,所以从来没有统一的标准3。
很多人并不喜欢SI提供的默认配置,那么我们就改吧。
选择Options/StyleProperties页面,就可以在其中修改所有样式了。
选择等号(=)表示继承ParentStyle,也可以选择Pick(或者ON/OFF等)去配置一个新值。
这完全视乎个人喜好。
1.1.3?
?
标识符样式选择
在与?
颜色定义?
一节同样的界面内即可完成此项配置。
1.1.4?
?
背景色选择
在希望要改变背景色的窗口点击鼠标右键(假定使用的是右手鼠标4),选择上下文菜单的xxxWindowProperties项,然后点击弹出窗口的BackColor按钮,即可修改该窗口背景色。
对于SI的源码主窗口,只需选择上下文菜单的SpecialWindowColor项即可完成背景色修改。
1.2?
?
配置合理的默认值高效工作
1.2.1?
?
使用合理的缩进
我始终认为最容易获得认同的是关于这个选项的配置了。
选择Options/DocumentOptions页面,点击其内的AutoIndent按钮,在弹出的AutoIndenting窗口中,默认配置为AutoIndentType选择Smart,且勾选了SmartIndentOptions中的两个可选项,这样得到的默认缩进效果为
?
?
?
?
while?
(1)
?
?
?
?
?
?
?
?
{
?
?
?
?
?
?
?
?
I
?
?
?
?
?
?
?
?
}
每次都要手工去调整其缩进,其实只要把两个勾选项去掉,就可以得到
?
?
?
?
while?
(1)
?
?
?
?
{
?
?
?
?
?
?
?
?
I
?
?
?
?
}
何乐而不为呢?
1.2.2?
?
显示坐标
通常情况下在窗口状态栏左下方,最会显示当前光标所在行列信息,但我总觉得不够明显,于是通常我们作如下配置:
选择Options/DocumentOptions页面,勾选其中的Showlinenumbers。
同时勾选其中的Showrightmargin,我们就可显示一条右边界,随时提醒我们是否该行代码写得过长了。
1.3?
?
创建便捷的快捷键快乐工作
1.3.1?
?
几个较常用的快捷键
默认情况下,SI已经定义了很多非常实用的快捷键:
∙F5
∙指定行号,实现行跳转,在遇到编译错误的时候,能特别方便的找到出错行。
∙Shift+F8
∙高亮显示指定标识,快速浏览标识的使用情况。
∙Ctrl+鼠标点击标识
∙直接跳转至标识定义处。
∙Ctrl+F
∙本文件内查找。
∙F3
∙本文件查找结果的上一个。
∙F4
∙本文件查找结果的下一个。
∙F7
∙打开BrowseProjectSymbols窗口,快速浏览工程内标识定义。
∙Ctrl+M
∙创建或查找书签,方便下次找回此位置。
1.3.2?
?
自定义快捷健
选择Options/KeyAssignments,在弹出的KeyAssignments窗口中可自由添加自己喜欢的快捷键。
比较值得推荐的有如下几个快捷键定义:
∙Edit:
DragLineDown
∙光标当前行下移。
∙Edit:
DragLineUp
∙光标当前行下移。
∙Edit:
JoinLines
∙当前行和下一行连接成一行。
1.3.3?
?
更多的快捷键
如果你正好对SI的Marco语言(下文将会介绍)有研究,那么还可以定义更多有用的快捷键,比如添加文件头、函数头、注释等(下文在介绍Marco语言时会介绍如何实现)。
2?
?
小技巧-中级应用
2.1?
?
查找与替换
在SI中支持多种查找及替换方式,除了上文提到的文件内查找外,还支持工程范围内查找、目录查找、指定多文件查找等等。
2.1.1?
?
查找
1.LoopupReferences
我们最常用的一种查找方式是选择Search/LookupReferences或按Ctrl+/组合键再或者鼠标点?
R?
按钮,在弹出的LoopupReferences窗口进行查找操作。
在SearchMethod中有四种可选的查找方式:
SimpleString、RegularExpression、KeywordExpression和LookUpReference。
其中SimpleString是最普通的查找方式,可以查找文件中出现的任意字符或字符,甚至可以查找?
_upap?
||?
u?
这样的字符串,但是在工程较大时,查找过程会较慢。
RegularExpression查找方式将在后面讲述正则表达时会介绍到,这里暂时按下不表。
KeywordExpression和LookUpReference查找的结果基本相同,但是显示方式略有差异。
这两种方式都是使用SI预先建立的数据库,查找起来速度相当快。
但通常这种速度只对在查找标识符时有明显效果。
对于像函数名,变量名等的查找,强烈建议使用这两种方式进行查找。
2.SearchFiles
3.选择Search/SearchFiles或按Ctrl+Shift+F组合键,在弹出的SearchFiles窗口进行查找操作。
在FileName框中可以填入文件名或文件夹。
注意当要查询的文件夹双包含子文件夹时,可以勾选Options中的IncludeSubdirectiories,实现对各层文件的递归搜索。
4.SearchProject
5.选择Search/SearchProject,在弹出的SearchProject窗口进行查找操作。
操作与LoopupReferences几乎完全一致,它们各自保存上次搜索的配置。
2.1.2?
?
替换
1.单文件替换
2.选择Search/Replace或按Ctrl+H组合键,在弹出的Replace窗口进行查找操作。
在Search项目里勾选Selection则仅对当前选中的文档部分进行替换。
另外如果勾选了ConfirmReplacements则是逐个确认替换,否则会同时替换所有符合替换条件内容。
3.多文件替换
4.选择Search/ReplaceFiles或按Ctrl+Shift+H组合键,在弹出的ReplaceFiles窗口进行查找操作。
除了增加New框(替换后的内容)外,其余均与SearchFiles窗口相同,可参照查找部分的说明进行操作。
2.2?
?
列操作
虽然开篇时就说过,SI的列操作功能比较弱,但不等于没有。
先按下Alt键,接着就可用鼠标进行列选择,然后就可以删除指定的列。
2.3?
?
无名技巧
这里介绍一些小技巧,大多数情况下我们可以无视它们的存在。
但如果我们知道这些,某些时候,会有效提高工作效率。
∙SmartRename
∙在上下文件菜单中选SmartRename或按Ctrl+'组合键,即可弹出SmartRename窗口。
它有很强大的功能,但最便捷的使用方式是更改函数内局部变量的名字,操作只作用于函数内部,速度非常快。
∙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为起始值重填数值。
∙EditCondition
∙很多代码尤其是驱动代码,当中有大量的预编译定义,以实现对不同硬件配置的支持。
在阅读这样的代码时最痛苦的是不能简单判断程序实际执行的代码分枝。
大量分枝同时存在,常常会混淆我们的视听。
比如对于下面的代码:
?
?
?
?
#ifdefDEV1
?
?
?
?
?
?
?
?
/*DEV1代码代码?
*/
?
?
?
?
#else
?
?
?
?
?
?
?
?
/*?
其它设备执行代码?
*/
?
?
?
?
#endif
如果确定我们当前分析的是DEV1的执行情况5,那么可以选择上下文件菜单的EditCondition选项,在弹出的ConditionalParsing窗口中把DEV1的值设置为True,那么#ifdefDEV1就等价于#if?
1了,相当注释掉了#else分枝的代码。
反之,设置为Flase时,则注释掉#ifdefDEV1分枝的代码。
3?
?
学会偷懒-高级应用
4?
?
附录1-SI中正则表达式
由于在查找及替换中,经常会使用用正则表达式6,这里对SI的正则表达式进行简单介绍。
4.1?
?
通配符
正则表达式通配符总表:
Character
Matches
^(在表达式开始处)
行的开始部分
.
任意单个字符
[abc]
任意属于集合?
abc?
的单个字符
[^abc]
任意不属于集合?
abc?
的单个字符
*
前面字符的0个或多个重复
+
前面字符的1个或多个重复
\t
一个?
tab?
字符
\s
一个空格符
\w
一个空白符(包括?
tab?
符和空格符)
$
行的结束部分
4.2?
?
表达式中的组
在执行替换操作时,组将大有用武之地。
正则表达式的各个部分可以用\(和\)进行分隔,分隔得到的每一项就是一个组。
在进行替换时可通过组从匹配内容中抽取出特定串。
在正则表达式中每个组都有一个编号,自左至右编号从1开始。
例如:
abc\(xyx\)将能匹配?
abcxyz?
,此时组1就包含了?
xyz?
串。
在进行替换操作时,就可以通过在替换后内容框中填入\1来取出这个字符串。
推而广之,可以使用\来取得组所包含的串。
例如:
当设定把\(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/OpenProject...
打开Base工程(该工程一般在"我的文档/SourceInsight/Projects/Base"中);
(2)Project/AddandRemoveProjectFiles...
加入宏文件(即utils.em);
(3)Options/MenuAssignments
打开MenuAssignments窗口,在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,T357written.
?
*?
--------------------
?
******************************************************************************/
其中的函数名及编写日期自动按实际情况填充,T357串可通过修改utils.em文件,改成你需要的名字。
6?
?
附录3-推荐格式
所谓人各有志,这里就不说啦。
7?
?
结束
至此,已将我所知的所有关于SourceInsight(未包括其附带的Macro语言)知识在此文档中描述出来。
如有错漏,请指正。
二、源代码查看工具SourceNavigator使用心得
SourceNavigator是RedHat出品的一款查看源代码的工具,非常好用,与Windows下的SourceInsight有一敌。
但是它的界面不怎么好看,用的不是GTK图形库,所以界面风格与Gnome不一致,操作上也有些不同。
除了这些,其它功能都非常强大,细数如下。
里面的一些简写约定如下:
CodeArea
cl
Classes
con
Constants
e
Enums
ec
EnumValues
fd
FunctionDeclarations
fr
friends
fu
Functions
gv
GlobalVariables
iv
InstanceVariables
ma
Macros
md
MethodDefinitions
mi
MethodImplementations
t
Typedefs
un
Unions
lv
Localvariables
ud
Undefined
Cross-Reference
r
Read
w
Written
p
Passed
u
Unused
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-2523:
19
from:
1通过apt-get安装(版本较旧)
安装命令:
sudoapt-getinstallsourcenav
启动命令:
snavigator
2手动安装最新版本
1)到官方网站获取软件包
2)解压缩
./configure--prefix=/opt/sourcenav(install文件推荐参数)
make
makeinstall
ps:
如果出现权限问题,前面加sudo
3)如果碰到下述错误
。
。
。
。
。
。
则在终端是输入:
sudoapt-getinstalllibx11-dev
4)启动snavigator
在终端直接输入:
snavigator
5)使用手册(usermanual)
还有一个sourceinsight和sourcenavigator的比较的帖子:
========================================================
运行sourcenavigator的问题
方法一、(转载)
安装完成后运行snavigator提示
[root@MagicLinuxsourcenav-6.0]#snavigator
Can'tfindausabletk.tclinthefollowingdirectories:
/usr/local/share/tk8.3
/usr/local/share/tk8.3/tk.tcl:
noeventtypeorbutton#orkeysym
noeventtypeorbutton#orkeysym
whileexecuting
"bindListbox{
%Wyviewscroll[expr{-(%D/120)*4}]units
}"
(file"/usr/local/share/tk8.3/listbox.tcl"line182)
invokedfromwithin
"source[filejoin$tk_librarylistbox.tcl]"
invokedfromwithin
"if{[stringcompare$tcl_platform(platform)"macintosh"]&&\
[stringcompare{}$tk_library]}{
source[filejoin$tk_librarybutton.tcl]
so..."
(file"/usr/local/share/tk8.3/tk.tcl"line30
invokedfromwithin
"source/usr/local/share/tk8.3/tk.tcl"
("uplevel"bodyline1)
invokedfromwithin
"uplevel\#0[listsource$file]"
Thisprobablymeansthattkwasn'tinstalledproperly.
不知其所以然,重新安装tk8.3无效,升级到tk8.5无效
后来在网上发现需要给下载的Source-Navigator6.0打补丁
到找到tk-8.4-lastevent.patch补丁
将补丁粘贴到sourcenavigator源码目录sourcenav-6.0/tk目录下,再cd到sourcenav-6.0/tk的源码目录
patch-p0-itk-8.4-