天天看點

Source Insight 使用與配置

轉自:http://blog.csdn.net/ison81/article/category/495791

source insight研究——配置篇

用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,選上後,聯想時可以出現該函數的詳細資訊。見下圖:

Source Insight 使用與配置

(簡單)

Source Insight 使用與配置

(詳細)

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的配置有兩級,一是全局配置,一是項目配置。出入友善考慮,統一一個配置就好了,在建立項目時選擇用全局配置(預設值)。

導入配置也可以通過輕按兩下配置檔案來完成。

source insight研究——快捷鍵篇

關于鍵盤和滑鼠誰更快捷之争,是一個永遠被程式員争論的話題。我想大多數人都不會極端的信奉一種操作方式,滑鼠更為大衆接受,但掌握一些快捷鍵對于提高操作速度是有幫助的。

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布局,還有配色。

source insight研究——正規表達式篇

正規表達式主要用來做搜尋和替換,一般強大一點的編輯器都會支援。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 Marco研究(文法篇)

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. 運算符

.加減乘除(+, -, *, /)

.邏輯(&&, ||, !)

.自增自減(++, --),可前可後

.算術比較(>, <, >=, <=, ==, !=)

.字元串比較(==, !=)

.字元串連接配接(#)與引用(@...@)