转自:http://blog.csdn.net/ison81/article/category/495791
用si有好几年了,零零散散也累积了不少心得,但总觉得还有一些内容是不知道的,所以今天干脆来个大清扫,把所有的选项都研究一遍,并把自认为有用的内容在这里整理一下。
si的主要配置都在Options->Perferences菜单里,
1、General
Project File Synchronization->Remove missing file from project选上可以避免因文件找不到而弹出错误对话框。
把Misc->Use stricter confirmation dialog选项去掉可以使确认时不输入"yes"。
2、Typing
Source Editing->Indent commands affect #-preprocessor statements。去掉后(默认值),进行多行缩进时不会影响预处理语句(如#if...#endif)。
Auto Completion->Use detailed completion window,选上后,联想时可以出现该函数的详细信息。见下图:
(简单)
(详细)
Auto Completion->Insert paremeters for functions,去掉后,自动联想不会把整个参数都输出到当前行。
Browsing in Lists->Match syllables while typing(slower)。在symbol list框检索符号时是否采用音节匹配方式,如对于函数FindNext,输入find或者next都可以找到该函数。该功能可能导致反应缓慢(视工程和机器配置而定),建议关闭,因为即使在关闭状态下也可以通过先输入空格再输入单词来动态启用该功能。
注意Browsing in Lists里其实有两个功能,但一般我们只能看到Match syllables while typing这一条,应该是si的菜单设计没有做好,导致在中文windows下不能显示全,另一个功能是Match members while typing,用于打开/关闭按成员变量名来检索类/结构体的功能。
3、Files
Opening Files->Sharing: Let other programs modify files,以共享方式打开文件,这个很重要,保证可以在其它编辑中同时编辑该文件。典型的场景就是用ide环境去动态编译调试,而用si静态阅读。
Customize 'Open' Command...,用于设置Ctrl+O打开的页面,默认选项是 Project File list view in Project Window,建议保持默认。
Saving Files->Preserve Undo data and revision marks after saving,如果发现保存后就不能undo了,请检查该选项是否选中。
Remove extra white space when saving。保存时自动去除每行尾部的空格和tab。建议选中。
4、Languages
自定义其它编程语言的语法解析,这个...还是另写一篇来讲吧。
Conditional Parsing不要错过了,这里的Conditions功能实在让人喜欢。Conditions是什么意思呢?我们的代码中一般都会有一些开关宏,通过在Conditions中配置这些宏的默认值,可以让si把配置为不开启的宏视为无效代码,从而不进行符号检索。
如果源代码中的开关宏太多,还可以使用Condition Parsing中的Scan Files来自动找出所有开关宏。
5、Symbol Lookups
没太多特别的。
6、Display
显示配置和个人喜好和显示器的状态有关,偶用的x60小本,屏幕资源有限,所以在Display Elements里把Project Window, Status Bar, Tool Bar,Clip Window都关了,基本用快捷键可以代替它们。
Options->Horizontal scroll bars for each new window。很多大师都教导我们说一行不要写太多代码。在这个指导思想下,我们不需要这个东东。
Show exact case of file names。如果看不惯si把所有的文件名首字母都大写就勾上这个选项吧。
Tile source and destination windows for Source Link commands。Source Link很多时候用于外部命令输出结果的解析(如Make, lint),这个功能会把解析结果与目标窗口自动tile,很实用。
Trim long path names with ellipses。这个建议不要选中。事实上这个主要影响标题栏,但一般来说标题栏上的空间是充裕的,选上之后往往会令我们不知道所编辑文件的具体位置。
7、Color
这个不用多说了。自己怎么喜欢怎么配吧。
8、Syntax Formatting
如果让大家说出喜欢si的几个理由,我想语法着色一定会是其中之一。
Basics->Use only color formatting。只启用style中关于颜色的设置。其它如粗体、斜体、阴影等都不启用。
Apply Styles for Lanugage Elements。把分类启用style,都选上吧。
Symbol Reference Lookups->Qualify references to members。检测成员的有效性,如果不是类/结构体中的一部分,则不启用style。虽然可能导致性能降低,但还是建议打开。同样Qualify references to functions也是。
这里有个按钮可以进入Doc Types页面(Options菜单也可以进入),里面有很多重要选项:
Editing Options中,
Expand tabs, Visible tabs可以帮助我们发现并转换tab。
Show right margint和Margin width可以提醒我们是否把一行写得太长。
Symbol Window选项建议关闭(因为有快捷键)。
Auto Indent对话框中,
如果没有特别喜好,建议把Smart Indent Options的两个勾都去掉。同时Auto Indent Type选Smart。
9、Syntax Decorations
可以把一些符号转换成特殊形式显示,如->转换成→。如果要使用该功能,不能开启Syntax Formatting->Basics->Use only color formatting。
Auto annotations下的三个功能都比较有用,
Show arrows at goto statements可以在goto时显示一个向上或向下的箭头,表示是向上goto还是向下goto。不过我们还是尽量不要用goto了。
Annotate closing braces with end-statement。在"}"后显示标识,表示该"}"与哪个if/switch配对。而下面的Annotate closing braces only for long blocks则是一个补充选项,表示只在较长的语句块时才显示标识。
10、Searching
没什么特别的,注意Automatically load selection into Find pattern。
11、Remote
与远程登录相关的一些选项。可以提高远程使用的显示性能。
12、Folders
没什么特别的。
最后简单说下si的配置文件。可以通过Options->Load Configuration/Save Configuration来导入/导出配置,可以导出全部,也可以导出某几个部分(如style)。si的配置有两级,一是全局配置,一是项目配置。出入方便考虑,统一一个配置就好了,在创建项目时选择用全局配置(默认值)。
导入配置也可以通过双击配置文件来完成。
关于键盘和鼠标谁更快捷之争,是一个永远被程序员争论的话题。我想大多数人都不会极端的信奉一种操作方式,鼠标更为大众接受,但掌握一些快捷键对于提高操作速度是有帮助的。
si为我们提供了丰富的快捷键和灵活的定制方式,同时还支持自定义命令和脚本,熟练掌握这些之后相信可以使你更加喜欢它。
以下是我认为比较有用的快捷键:
1. ctrl+o,打开文件列表
2. F7,打开符号检索窗口(全局列表)
3. F8,打开符号检索窗口(本地文件)
4. ctrl+=,调转到符号的定义处
5. alt+, /alt+. 跳转到前/后一次停留的地方
7. ctrl+/,全局搜索
8. ctrl+',搜索并替换
9. shift+f8,把当前光标下的关键字标记为高亮
另外常用的ctrl+c, ctrl+v这些就不说了,但是si很别扭的是把ctrl+a设置为save all还不是select all,的确我承认前者可能比后者使用频率更高,但谁让我们已经被windows惯坏了呢?
更让人奇怪的是,我这个最新的si居然不能在Key Assignments中找到Select All命令。这样就不能把ctrl+a设置成Select All了。真的这样吗?其实还有一个万能招,就是用si的宏自己写一个select all出来,这并不难,但也不容易,主要是要学习一下它内建的那些个api,这里并不想讨论怎么写宏,还是另找别处吧。好了,select all的写法如下:
macro SelectAll()
{
hwnd = GetCurrentWnd();
hbuf = GetCurrentBuf();
selrec = GetWndSel(hwnd);
selrec.lnFirst = 0;
selrec.ichFirst = 0;
selrec.lnLast = GetBufLineCount(hbuf);
selrec.ichLim = 0;
selrec.fExtended = TRUE;
selrec.fRect = FALSE;
SetWndSel(hwnd, selrec);
}
我比较反对把快捷键的设置改得太多,如果没有必要最好还是保持系统原设,这样当你在别的机器上操作时也不致于太陌生。
最后附上我的si布局,还有配色。
正则表达式主要用来做搜索和替换,一般强大一点的编辑器都会支持。si在搜索和替换界面里都有Use Regular Expression这样的选项。个人认为使用正则表达式(后简称RE)应该是每个程序员都应该掌握的技能。虽然和vim这些相比si对RE的支持还是弱一点,但对于从未了解过RE的人来说,从si这样的编辑器来入门RE也不失为一个好的选择。
学习任何一项科学或技术,了解其涉及的各种概念是第一步,也是比较花时间的一步,我们需要先通读达到大概了解,再实践,在实践中去理解,然后再总结,得出自己的结论,把书本变薄。
RE中的主要概念就是一堆通配符。通配符可以分为两类,一种是表内容的,一种是表数量的。
表内容的如:
. 任意字符
[abc] 任何在[]之内的字符
[^abc] 任何不在[]之内的字符,^表示不在[]之内
还有一些就是转义字符了如/t(tab), /s(space), /w(tab or space)
表数量的如:
* 大于等于0个
+ 大于0个,也就是至少有1个
其它如:
^ 表示行起始,注意不要把这个^和[]里的^搞混了。
$ 表示行的结束
要说明的是,不同的工具对RE的支持不太一样,比如强一点的工具支持的通配符可能会多一点,转义字符的定义也可能不一样等等。
举个例子理解一下吧,
.* 这条RE可以匹配任意的字符串序列,因为.表示任意字符,*表示大于等于0个,连起来理解就是“任意个任意字符”
[abc]+ 表示“a或b或c出现1次或多次”,像字符串abc, cbac, aacbcb,aaaaa都被可以匹配
如果还不是很理解可以用si的搜索功能自己实践一下。
在理解上面的基础之上就可以使用RE进行替换了,替换和搜索没有什么不同,比如你可以将"[abc]+"替换成"abc",但如果仅仅是这样就没有什么意思了。替换里和RE相关的内容是分组。与分组有关的概念包括:
1. 一个分组以/(开始,以/)结束
2. 一个RE中可以有多个分组
3. 引用一个分组使用/1, /2, /3, ...
还是举个例子吧,假设我们的代码中有个函数叫func,它的原型定义如下
void func(int var1, int var2)
某天我心血来潮,把func的原型修改成了,
void func(int var2, int var1),
如果没有RE,这下子可就麻烦了,所有调用func的地方都要手工挨个修改,好在有RE。按下Ctrl+h,选择使用RE进行替换,在Old中输入"func(/(.*/), /(.*/))",在New中输入"func(/2, /1)",然后执行,你会发现全部搞定了。
当然ctrl+h只能在本文件中搜索替换,要想替换整个工程的,可以使用ctrl+shift+h。
Source Insight宏语法与C相似,编写好的宏以.em文件存储。要使用宏先需要把.em文件加入到当前工程或是Base工程中,然后为其分配一个快捷键或是菜单项,之后就可以使用键盘或是点击菜单来调用宏。
si的宏语法“不是”大小写敏感的,且每行语句不强制要求以分号结束,语法元素之间的空格将被自动忽略,变量名必须以字母开头。
1. 宏定义方法如下,可以传递参数,可以有返回值,但和一些脚本语言一样,在si宏中没有数据类型一说。
macro my_macro(a, b, c)
{
...
return a+b+c
}
2. 以下代码展示了si宏的控制语句,学过C语言的人都可以很快上手。
while (条件)
{
if (条件)
{
...
break
}
else
{
continue
}
return 0
}
3. 以下代码展示了变量的定义
macro SomeFunction()
{
var localx //定义局部变量,局部变量可以不定义而直接使用
global globalvariables; //定义全局变量
localx = 1; //局部变量赋值,作用域是当前macro
globalvariables = "ison81" //全局变量赋值,作用域是整个si,其它macro也可以访问
}
4. 以下代码展示了关于变量和数据类型的一些注意事项,
a. 空串
{
S = nil // s is set to the empty string
S = "" // same as nil
}
b. 在变量中展开字符串,使用@...@
S = “Hey, @username@, don’t break the build again!”
c. 字符串当成数字来运算
s = "1"
x = s + 2 // x now contains the string "3"
y = 2 * x + 5 // x now contains "11"
但这样就是错的,
s = "hello"
x = s + 1 // error
如果要灵活,可以先检测一个字符串是不是数字,
if (IsNumber(x))
x = x / 4 // okay to do arithmetic
d. 引用字符串中的字符,
s = "abc"
x = s[0] // x now contains the string "a"
si的字符串也是zero-terminated,
s = "abc"
length = strlen(s)
ch = s[length] // ch now contains the empty string
if (ch == "")
msg "End of string."
5. 关于结构体
定义
Rec = nil // initializes as an empty string
Rec.name = “Joe Smith”
Rec.age = “34”
Rec.experience = “guru”
另一种定义方法,
rec = “name=/”Joe Smith/”;age=/”34/”;experience=/”guru/””
引用结构体
Filename = slr.file // get file field of slr
LineNumber = slr.lnFirst // get lnFirst field of slr
6. 关于数组
si宏并没有提供数组的概念,数组是通过buf来模拟实现的,关于buf还是在介绍macro API时再讨论。
7. 运算符
.加减乘除(+, -, *, /)
.逻辑(&&, ||, !)
.自增自减(++, --),可前可后
.算术比较(>, <, >=, <=, ==, !=)
.字符串比较(==, !=)
.字符串连接(#)与引用(@...@)