SourceInsight常⽤功能设置
熟悉⼯具的使⽤能在⼀定程度上提⾼⼯作效率,但⼯具永远只是⼯具,⼤家要把重点放在内功的修炼上。
符号导航
符号(变量、宏定义、结构定义、枚举、函数等等)在SI 中的检索⾮常⽅便。Ctrl+⿏标左键或Ctrl+=可以⽴即转到符号的定义处,Alt+/可以打开⼀个窗⼝查看符号的定义。F7 浏览或查⼯程的全局变量和函数,F8 浏览查当前⽂件的全局变量和函数。Ctrl+/打开 Lookup Reference 窗⼝⽤于搜索符号在⼯程中的索引,所有搜索结果在搜索窗⼝中显⽰,点击搜索结果左边的红⾊源链接即可打开其所在位置。Lookup Reference 是在整个⼯程⽂件中进⾏搜索,要只在当前⽂件或特定的⽬录下进⾏搜索,使⽤ Ctrl+H 或Ctrl+Shfit+H 进⾏搜索,F3 和F4 是上⼀个、下⼀个搜索结果的快捷键。
使⽤Shift+F8 可以让当前的符号在整个⼯程⽂件中⾼亮显⽰。
参数设置
SI 有很⾃由的⾃定义功能,⼏乎所有的窗⼝都可以⾃定义字体、颜⾊,可以轻松地把各种类型关键字、变量、标志符、函数、宏、注释等定义为不同的颜⾊和显⽰⽅式(正体或斜体、加粗或正常、加下划
线、放⼤显⽰等),可以随意的增加修改删除菜单项和快捷键。更重要的是,可以通过⾃定义命令执⾏外部程序,也可以通过 SI ⾃⼰的宏语⾔,⾃⼰写⼀段程序实现特定的功能,这些可以提⾼我们⼯作的效率,从重复繁琐的⼯作中解脱出来。
字体选择
在 SI 中样式是可以被继承,如果要从根本上改变字体,最简单的⽅式就是直接修改根样式中的字体,因为其它样式都会由此继承⽽来。选择 Options/Document Options 页⾯内的 Font Options 中的Screen Fonts 字体,即可改变根样式中的字体。
SI 中的默认配置为Verdana 字体,是⼀种⾮等宽字体,为了使编写的代码在各种编辑器中看起来都有良好的对齐效果,强烈建议使⽤等宽字体,Courier、New Courier 和宋体等都是较好的选择。
背景⾊设置
Options->preference->color->windows background设置背景⾊(护眼⾊:85,90,205)
缩进设置
选择 Options/Document Options 页⾯,点击其内的Auto Indent 按钮,在弹出的Auto Indenting 窗⼝
中,Auto Indent Type 选择 Smart,取消勾选Smart Indent Options 中的两个可选项。同时 Options->Document Options 中,Tab Width 输⼊4,取消Expand tabs 复选框。
Edit Condition
当中代码中有⼤量的预编译定义,在阅读这样的代码时最痛苦的是不能简单判断程序实际执⾏的代码分⽀。⼤量分⽀同时存在,常常会混淆我们的视听。⽐如对于下⾯的代码:
#ifdef DEV1
……
#else
……
护眼设置#endif
如果确定我们当前分析的是 DEV1 的执⾏情况,那么可以选择上下⽂件菜单的Edit Condition 选项,在弹出的 Conditional Parsing 窗⼝中把DEV1 的值设置为True,那么#ifdef DEV1 就等价于#if 1 了,相当注释掉了#else 分枝的代码。反之,设置为 Flase 时,则注释掉#ifdef DEV1 分枝的代码。
中⽂间距过⼤问题
默认情况下,往Source Insight ⾥输⼊中⽂,字间距相当的⼤。是因为字体设置的原因,进⾏如下设置如下可解决:
1. Options->Style Properties,打开样式对话框;
2. 在左边 Style Name 下到Comment Multi Line 和 Comment.在其右边对应的 Font 属性框下的Font Name 中选“” 设置为宋体、常规、⼩四。确定,退回Style Properties 界⾯,Size 设为 10。
Smart Rename
在上下⽂件菜单中选 Smart Rename 或按Ctrl+'组合键,即可弹出Smart Rename 窗⼝。它有很强⼤的功能,但最便捷的使⽤⽅式是更改函数内局部变量的名字,操作只作⽤于函数内部,速度⾮常快。
恢复 Ctrl+A 的全选功能
利⽤⾃定义快捷键,把功能定义成熟悉的按键。⽐如⼀般的编辑器,按下 Ctrl+A 是全选功能,但默认是 SI 的全选没有快捷键,Ctrl+A 默认是保存全部的操作。在 Custom Key 对话框中,通过关键词save 到save all,更改为Ctrl+Shift+A,通过关键词select 到select all,更改为Ctrl+A。
添加⽂件类型
⽤户可以定义⾃⼰的类型,Options->Document Options->add type,定义⽂件类型名以及⽂件名后缀。勾选 include when adding to projects 在添加⽬录下⽂件到⼯程时该类⽂件就会添加进 SI 的⼯程。如果需要将所有⽂件添加进 SI 的⼯程,可以定义⼀种⽂件类型*.*。
列操作
先按下Alt 键,接着⿏标左键拖动⿏标进⾏列选择,然后就可以删除指定的列。
添加⾃定义功能
在 SI 中可以⾃定义命令,⽅便的调⽤外部程序。举个例⼦:
1. Options->-&,New Command name 随便填⼊命令的名字;
2. Run 中写⼊: ShellExecute open explorer /e,/select,%f;
意思是打开资源管理器并选中当前⽂件。%f 为⽂件名。
3. 还是同⼀个对话框⾥⾯,选择 Keys->Assign ->按下执⾏该命令的快捷键下⾯是⼀些关
于TortoiseSVN 的常⽤⾃定义功能(需要更改相应的TSVN 安装⽬录):
查看修改(diff): "C:\Program Files\TortoiseSVN\" /command:diff /path:%f /notempfile/closeonend
提交(check in): "C:\Program Files\TortoiseSVN\" /command:commit /path:%f /notempfile/closeonend
更新(update):"C:\Program Files\TortoiseSVN\" /command:update /path:%f /notempfile/closeonend
宏语⾔使⽤
⼤家可能很少⽤到SI的宏语⾔(Source Insight macro language),这是⼀种功能强⼤的编程语⾔,⼏乎可以实现在编程过程可能使⽤到的各种功能。这⾥不准备对如何使⽤宏语⾔进⾏编程作介绍(可参阅SI帮助⽂档中的“Macro Language Guide”部分。),只介绍如何使⽤已编好的程序。更多的宏⽂件在www.sourceinsight/public/macros/下载。
宏⽂件导⼊与使⽤
宏⽂件,以.em 为后缀使⽤宏语⾔编写的⽂件,源⽂件中的每个“macro 宏名()”定义⼀个宏函数(功能),为宏名定义菜单或快捷键即可使⽤该功能。宏⽂件的使⽤⽅法如下:
1. Project->Open Project
打开 Base ⼯程(该⼯程⼀般在"我的⽂档/Source Insight/Projects/Base"中);
2. Project->Add and Remove Project Files
加⼊宏⽂件;
3. Options->Menu Assignments(或者把该宏功能定义为快捷键)
打开 Menu Assignments 窗⼝,在Command 中输⼊Macro,选中要使⽤的宏,添加到合适的菜单中。或者打开 Key Assignment 窗⼝,选中要使⽤的宏,点Assigned New Key,选择要使⽤的快捷键。设置完后,选择对应的菜单项或按快捷键,即可实现宏函数功能。
参考资料
⾸选SI ⾃带的帮助⽂档(按F1 启动),有⾮常详细的说明。
macro InsFileHeader()
{
szMyName = "XXX"/* Enter your name */
/* Get current time */
szTime = GetSysTime(1)
Day = szTime.Day
Month = szTime.Month
Year = szTime.Year
if (Day < 10)
szDay = "0@Day@"
else
szDay = Day
if (Month < 10)
szMonth = "0@Month@"
else
szMonth = Month;
szFileName = Ask("Enter file name and its extention, for example, \"main.c\": ");
/* promote the description of the file*/
szDescription = Ask("Enter the description of file:")
hBuf = GetCurrentBuf()
hbuf = GetCurrentBuf()
InsBufLine(hbuf, 0, "/*")
InsBufLine(hbuf, 1, " *")
InsBufLine(hbuf, 2, " *")
InsBufLine(hbuf, 3, " *\\file @szfileName@")
InsBufLine(hbuf, 4, " *\\brief @szDescription@.")
InsBufLine(hbuf, 5, " *")
InsBufLine(hbuf, 6, " *\\author @szMyName@")
InsBufLine(hbuf, 7, " *\\version 1.0.0")
InsBufLine(hbuf, 8, " *\\date @szMonth@\/@szDay@\/@Year@")
InsBufLine(hbuf, 9, " *")
InsBufLine(hbuf, 10, " *\\history \\arg 1.0.0 @szMonth@\/@szDay@\/@Year@, @szMyName@, Create file.") InsBufLine(hbuf, 11, " */")
}
macro InsFunHeader()
{
// Get a handle to the current file buffer and the name
// and location of the current symbol where the cursor is.
hbuf = GetCurrentBuf()
szFunc = GetCurSymbol()
ln = GetSymbolLine(szFunc)
szDescription = Ask("Enter the description of function:")
// begin assembling the title string
InsBufLine(hbuf, ln + 0, "/*!")
InsBufLine(hbuf, ln + 1, " *\\fn @szFunc@()")
InsBufLine(hbuf, ln + 2, " *\\brief @szDescription@.")
InsBufLine(hbuf, ln + 3, " *\\details ")
InsBufLine(hbuf, ln + 4, " * ")
InsBufLine(hbuf, ln + 5, " *\\param[in] N\/A.")
InsBufLine(hbuf, ln + 6, " *\\param[out] N\/A.")
InsBufLine(hbuf, ln + 7, " * ")
InsBufLine(hbuf, ln + 8, " *\\return N\/A.")
InsBufLine(hbuf, ln + 9, " *\\retval N\/A.")
InsBufLine(hbuf, ln + 10, " * ")
InsBufLine(hbuf, ln + 11, " *\\note")
InsBufLine(hbuf, ln + 12, " */")
}
macro InsVarComments()
{
hwnd = GetCurrentWnd()
ln = GetWndSelLnFirst(hwnd)
szDef = Ask("Enter the name of the variable:")
szDescription = Ask("Enter the description of Varaables:")
hbuf = GetCurrentBuf()
InsBufLine(hbuf, ln + 0, "/*!")
InsBufLine(hbuf, ln + 1, " *\\def @szDef@")
InsBufLine(hbuf, ln + 2, " *\\brief @szDescription@")
InsBufLine(hbuf, ln + 3, " */")
}
macro addNameTime()
{
szMyName = "XXX"/* Enter your name */
hwnd = GetCurrentWnd()
se = getwndsel(hwnd)
ln = GetWndSelLnFirst(hwnd)
hbuf = GetCurrentBuf()
str = GetBufSelText(hbuf)
/* Get current time */
szTime = GetSysTime(1)
Day = szTime.Day
Month = szTime.Month
Year = szTime.Year
if (Day < 10)
szDay = "0@Day@"
else
szDay = Day
if (Month < 10)
szMonth = "0@Month@"
else
szMonth = Month;
hbuf = GetCurrentBuf()
if (se.fExtended)
str = "/*!<" #str# "*/"
SetBufSelText(hbuf, str)
}
else
{
str = "/*!< @szMyName@ : @szMonth@/@szDay@/@Year@*/" se.ichFirst = se.iChFirst + 3
se.ichLim = se.ichLim + 3
SetBufSelText(hbuf, str)
SetBufIns (hbuf, ln, se.iChFirst)
SetWndSel(hwnd, se)
}
}
macro preventIncludeRepeatly()
{
hwnd = GetCurrentWnd()
lnFirst = GetWndSelLnFirst(hwnd)
lnLast = GetWndSelLnLast(hwnd)
/* get file name */
szFileName = Ask("Enter name of header file:")
szFileName = toupper(szFileName)
szFileName = cat("__", szFileName)
szFileName = cat(szFileName, "_H__")
hbuf = GetCurrentBuf()
InsBufLine(hbuf, lnFirst, "#ifndef @szFileName@")
InsBufLine(hbuf, lnFirst +1, "#define @szFileName@")
InsBufLine(hbuf, lnFirst +2, "")
InsBufLine(hbuf, lnLast +4, "")
InsBufLine(hbuf, lnLast +5, "#endif /* @szFileName@ */")
}
macro InsertCPlusPlus()
{
hwnd = GetCurrentWnd()
lnFirst = GetWndSelLnFirst(hwnd)
lnLast = GetWndSelLnLast(hwnd)
hbuf = GetCurrentBuf()
InsBufLine(hbuf, lnFirst, "#ifdef __cplusplus")
InsBufLine(hbuf, lnFirst +1, "extern \"C\" {")
InsBufLine(hbuf, lnFirst +2, "#endif")
InsBufLine(hbuf, lnFirst +3, "")
InsBufLine(hbuf, lnLast +5, "")
InsBufLine(hbuf, lnLast +6, "#ifdef __cplusplus")
InsBufLine(hbuf, lnLast +7, "}")
InsBufLine(hbuf, lnLast +8, "#endif")
}
macro addComment()
{
hwnd = GetCurrentWnd()
se = getwndsel(hwnd)
ln = GetWndSelLnFirst(hwnd)
hbuf = GetCurrentBuf()
str = GetBufSelText(hbuf)
if (se.fExtended)
{
str = "/*!<" #str# "*/"
SetBufSelText(hbuf, str)
}
else
{
str = "/*!< */"
se.ichFirst = se.iChFirst + 3
se.ichLim = se.ichLim + 3
SetBufSelText(hbuf, str)
SetBufIns (hbuf, ln, se.iChFirst)
SetWndSel(hwnd, se)
}
}
macro addFileInformation()
{
addGlobalFunctions()
addPublicFunctions()
addLocalFunctions()
addLocalPrototypes()
addExternPrototypes()
addFunctions()
addVariables()
addTypes()
addDefines()
addIncludeFiles()
addConfigrations()
}
macro addConfigrations()
{
hwnd = GetCurrentWnd()
ln = GetWndSelLnFirst(hwnd)
hbuf = GetCurrentBuf()
InsBufLine(hbuf, ln, "/**********************************************************************/")
InsBufLine(hbuf, ln +1, "/* CONFIGURATIONS */")
InsBufLine(hbuf, ln +2, "/**********************************************************************/") }
macro addIncludeFiles()
{
hwnd = GetCurrentWnd()
ln = GetWndSelLnFirst(hwnd)
hbuf = GetCurrentBuf()
InsBufLine(hbuf, ln, "/**********************************************************************/")
InsBufLine(hbuf, ln +1, "/* INCLUDE_FILES */")
InsBufLine(hbuf, ln +2, "/**********************************************************************/") }
macro addDefines()
{
hwnd = GetCurrentWnd()
ln = GetWndSelLnFirst(hwnd)
hbuf = GetCurrentBuf()
InsBufLine(hbuf, ln, "/**********************************************************************/")
InsBufLine(hbuf, ln +1, "/* DEFINES */")
InsBufLine(hbuf, ln +2, "/**********************************************************************/") }
macro addTypes()
{
hwnd = GetCurrentWnd()
ln = GetWndSelLnFirst(hwnd)
hbuf = GetCurrentBuf()
InsBufLine(hbuf, ln, "/**********************************************************************/")
InsBufLine(hbuf, ln +1, "/* TYPES */")
InsBufLine(hbuf, ln +2, "/**********************************************************************/") }
macro addVariables()
{
hwnd = GetCurrentWnd()
ln = GetWndSelLnFirst(hwnd)
hbuf = GetCurrentBuf()
InsBufLine(hbuf, ln, "/**********************************************************************/")
InsBufLine(hbuf, ln +1, "/* VARIABLES */")
InsBufLine(hbuf, ln +2, "/**********************************************************************/") }
macro addFunctions()
{
hwnd = GetCurrentWnd()
ln = GetWndSelLnFirst(hwnd)
hbuf = GetCurrentBuf()
InsBufLine(hbuf, ln, "/**********************************************************************/")
InsBufLine(hbuf, ln +1, "/* FUNCTIONS */")
InsBufLine(hbuf, ln +2, "/**********************************************************************/") }
macro addExternPrototypes()
{
hwnd = GetCurrentWnd()
发布评论