1. 程式人生 > >source insight 使用教程

source insight 使用教程

若干年前曾寫個一篇關於source insight巨集的使用文章,放到這裡後就一直沒有理會。過了很久之後,偶然的一次查詢,才知道已經有不少地方引用那篇文章,想來文章還是有一定用處的。
前段時間剛好有空閒時間,於是又寫一篇關於source insight的文章,這次側重於實用技巧的介紹,希望對大家有幫助。

我常常這樣想,Source Insight(下文的SI指的也是它)就是這樣的一個東西:
  Windows下開發人員的至愛,功能強大,介面友好。支援語法高亮、符號跳轉,還支援函式呼叫關係圖顯示。這是一個專業的程式設計環境,很多大公司都是使用它的。這個編輯器除支援完善的自定義功能外,幾乎所有配置都能作個性化配置。除此之外,它本身帶有一套功能強大的巨集語言(Macro Language),藉助這種語言可以很方便的程式設計實現各種特殊功能,非一般編輯器所能比擬。查詢功能支援得也很不錯。雖然在工程較大時,查詢起來有點慢。但是它除了一般編輯器所支援的普通字串查詢、正則表示式查詢外,還能支援關鍵字查詢-這種方式比前兩者快得多,也算是一個彌補。不足之處是列模式較弱,對中文支援有缺陷。
顯然,它也像其它任何東西一樣的,同時具有優點和缺點的本性的,究竟如何,且聽我一一道來。


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  查詢

  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預先建立的資料庫,查詢起來速度相當快。但通常這種速度只對在查詢識別符號時有明顯效果。對於像函式名,變數名等的查詢,強烈建議使用這兩種方式進行查詢。
  2. Search Files
    選擇Search/Search Files或按Ctrl+Shift+F組合鍵,在彈出的Search Files視窗進行查詢操作。 在File Name框中可以填入檔名或資料夾。注意當要查詢的資料夾雙包含子資料夾時,可以勾選Options中的Include Subdirectiories,實現對各層檔案的遞迴搜尋。
  3. Search Project
    選擇Search/Search Project,在彈出的Search Project視窗進行查詢操作。操作與Loopup References幾乎完全一致,它們各自儲存上次搜尋的配置。

2.1.2  替換

  1. 單檔案替換
    選擇Search/Replace或按Ctrl+H組合鍵,在彈出的Replace視窗進行查詢操作。在Search專案裡勾選Selection則僅對當前選中的文件部分進行替換。另外如果勾選了Confirm Replacements則是逐個確認替換,否則會同時替換所有符合替換條件內容。
  2. 多檔案替換
    選擇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  萬用字元

正則表示式萬用字元總表:
Character Matches
^ (在表示式開始處) 行的開始部分
. 任意單個字元
[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語言)知識在此文件中描述出來。 如有錯漏,請指正。