1. 程式人生 > >解決了 source insight 設定為 微軟雅黑後 中文字型重影

解決了 source insight 設定為 微軟雅黑後 中文字型重影

source insight 3.50,英文版。相信一定有人用的相同的設定。

(1)設定字型大小;設定Tab為4個空格。

長時間看程式誰也受不了,所以設定大號字型是必須的。

在Option->Docutment Option裡設定Screen Fonts和Tab Width。

另外點選Auto Indenting,取消右邊的兩個選擇,即設定{和}不自動縮排

(2)設定中文註釋為一個字元寬度

baidu來的,很管用。在Option->Style Properties中,先在左邊列表裡選擇Comment,在右邊的Font Name下拉選單中選擇Pick,然後設定為宋體等,設定完了就Ok。同樣選擇Comment Multi Line完成相同操作。

(3)更改快捷鍵

取消小鍵盤,baidu來的:
Options選單àKey assignments,通過關鍵詞Scroll 找到Scroll Half Page Up,取消小鍵盤/;通過關鍵詞Scroll 找到Scroll Half Page Down取消小鍵盤*;通過關鍵詞Function找到Function Up,取消小鍵盤-,通過關鍵詞Function找到Function down,取消小鍵盤+。

設定全選快捷鍵:在Options選單àKey assignments裡面找到Save all,取消ctrl+a快捷鍵;選擇select all,設定為Ctrl+a。

設定刪除整行快捷鍵,Edit: Delete Line設為shift+del.

(4)雙字元操作更好一些

baidu來的,使用下面的一個巨集,即Project→Open Project,開啟Base專案;新建一個SuperBackSpace.em檔案,將下面的程式碼加入進去並儲存,並將檔案加入到Base專案;重啟SourceInsight;開啟Options→Key Assignments,將Marco: SuperBackspace繫結到BackSpace鍵,Marco: SuperCursorLeft繫結到<-鍵,Marco: SuperCursorRight繫結到->鍵,Marco: SuperShiftCursorLeft繫結到Shift+<-,macro,SuperShiftCursorRight繫結到shift+->,Macro:SuperDelete繫結到del。

//**
* 2006 丁兆傑 Ding Zhaojie

*
* SuperBackspace Version 0.1beta
*
* 代替SourceInsight原有的Backspace功能(希望如此)
* 增加了對雙位元組漢字的支援,在刪除漢字的時候也能同時刪除漢字的高位元組而緩解半個漢字問題
* 能夠對游標在漢字中間的情況進行自動修正
*
* 安裝:
* ① 複製入SourceInsight安裝目錄;
* ② Project→Open Project,開啟Base專案;
* ③ 將複製過去的SuperBackspace.em新增入Base專案;
* ④ 重啟SourceInsight;
* ⑤ Options→Key Assignments,將Marco: SuperBackspace繫結到BackSpace鍵;
* ⑥ Enjoy!!
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
macro SuperBackspace()
{
    hwnd = GetCurrentWnd();
    hbuf = GetCurrentBuf();

    if (hbuf == 0)
        stop;   // empty buffer

    // get current cursor postion
    ipos = GetWndSelIchFirst(hwnd);

    // get current line number
    ln = GetBufLnCur(hbuf);

    if ((GetBufSelText(hbuf) != "") || (GetWndSelLnFirst(hwnd) != GetWndSelLnLast(hwnd))) {
        // sth. was selected, del selection
        SetBufSelText(hbuf, " "); // stupid & buggy sourceinsight :(
        // del the " "
        SuperBackspace(1);
        stop;
    }

    // copy current line
    text = GetBufLine(hbuf, ln);

    // get string length
    len = strlen(text);

    // if the cursor is at the start of line, combine with prev line
    if (ipos == 0 || len == 0) {
        if (ln <= 0)
            stop;   // top of file
        ln = ln - 1;    // do not use "ln--" for compatibility with older versions
        prevline = GetBufLine(hbuf, ln);
        prevlen = strlen(prevline);
        // combine two lines
        text = cat(prevline, text);
        // del two lines
        DelBufLine(hbuf, ln);
        DelBufLine(hbuf, ln);
        // insert the combined one
        InsBufLine(hbuf, ln, text);
        // set the cursor position
        SetBufIns(hbuf, ln, prevlen);
        stop;
    }

    num = 1; // del one char
    if (ipos >= 1) {
        // process Chinese character
        i = ipos;
        count = 0;
        while (AsciiFromChar(text[i - 1]) >= 160) {
            i = i - 1;
            count = count + 1;
            if (i == 0)
                break;
        }
        if (count > 0) {
            // I think it might be a two-byte character
            num = 2;
            // This idiot does not support mod and bitwise operators
            if ((count / 2 * 2 != count) && (ipos < len))
                ipos = ipos + 1;    // adjust cursor position
        }
    }

    // keeping safe
    if (ipos - num < 0)
        num = ipos;

    // del char(s)
    text = cat(strmid(text, 0, ipos - num), strmid(text, ipos, len));
    DelBufLine(hbuf, ln);
    InsBufLine(hbuf, ln, text);
    SetBufIns(hbuf, ln, ipos - num);
    stop;
}
/*
以下是自編,參考上面以及SourceInsight中的chm幫助文件;

有缺點:(1)移動箭頭也會記錄到歷史操作步驟,應該能夠避免這些操作被記錄;(2)函式沒有整理,有冗餘;

*/
//2、刪除鍵——SuperDelete.em


macro SuperDelete()
{
    hwnd = GetCurrentWnd();
    hbuf = GetCurrentBuf();

    if (hbuf == 0)
        stop;   // empty buffer

    // get current cursor postion
    ipos = GetWndSelIchFirst(hwnd);

    // get current line number
    ln = GetBufLnCur(hbuf);

    if ((GetBufSelText(hbuf) != "") || (GetWndSelLnFirst(hwnd) != GetWndSelLnLast(hwnd))) {
        // sth. was selected, del selection
        SetBufSelText(hbuf, " "); // stupid & buggy sourceinsight :(
        // del the " "
        SuperDelete(1);
        stop;
    }

    // copy current line
    text = GetBufLine(hbuf, ln);

    // get string length
    len = strlen(text);
       
    if (ipos == len || len == 0) {
totalLn = GetBufLineCount (hbuf);
lastText = GetBufLine(hBuf, totalLn-1);
lastLen = strlen(lastText);

        if (ipos == lastLen)// end of file
   stop;

        ln = ln + 1;    // do not use "ln--" for compatibility with older versions 
        nextline = GetBufLine(hbuf, ln);
        nextlen = strlen(nextline);
        // combine two lines
        text = cat(text, nextline);
        // del two lines
        DelBufLine(hbuf, ln-1);
        DelBufLine(hbuf, ln-1);
        // insert the combined one
        InsBufLine(hbuf, ln-1, text);
        // set the cursor position
        SetBufIns(hbuf, ln-1, len);
        stop;
    }

    num = 1; // del one char
    if (ipos > 0) {
        // process Chinese character
        i = ipos;
        count = 0;
        while (AsciiFromChar(text[i-1]) >= 160) {
            i = i - 1;
            count = count + 1;
            if (i == 0)
                break;
        }
        if (count > 0) {
            // I think it might be a two-byte character
            num = 2;
            // This idiot does not support mod and bitwise operators
            if (((count / 2 * 2 != count) || count == 0) && (ipos < len-1)) 
                ipos = ipos + 1;    // adjust cursor position
        }

// keeping safe
if (ipos - num < 0)
            num = ipos; 
    }
    else {
i = ipos;
count = 0;
while(AsciiFromChar(text[i]) >= 160) {
     i = i + 1;
     count = count + 1;
     if(i == len-1)
   break;
}

if(count > 0) {
     num = 2;
}
    } 
    
    text = cat(strmid(text, 0, ipos), strmid(text, ipos+num, len));
    DelBufLine(hbuf, ln);
    InsBufLine(hbuf, ln, text);
    SetBufIns(hbuf, ln, ipos);
    stop;
}

//3、左移鍵——SuperCursorLeft.em

macro IsComplexCharacter() 
{
hwnd = GetCurrentWnd();
hbuf = GetCurrentBuf();

if (hbuf == 0) 
   return 0;


//當前位置
pos = GetWndSelIchFirst(hwnd);

//當前行數
ln = GetBufLnCur(hbuf);

//得到當前行
text = GetBufLine(hbuf, ln);

//得到當前行長度
len = strlen(text);

//從頭計算漢字字元的個數
if(pos > 0) 
{
   i=pos;
   count=0;
   while(AsciiFromChar(text[i-1]) >= 160)
   { 
    i = i - 1;
    count = count+1;
    if(i == 0) 
     break;
   }

   if((count/2)*2==count|| count==0)
    return 0;
   else
    return 1;
}

return 0;
}

macro moveleft() 
{
hwnd = GetCurrentWnd();
hbuf = GetCurrentBuf();
if (hbuf == 0)
        stop;   // empty buffer
        
ln = GetBufLnCur(hbuf); 
ipos = GetWndSelIchFirst(hwnd);

if(GetBufSelText(hbuf) != "" || (ipos == 0 && ln == 0))   // 第0行或者是選中文字,則不移動
{
   SetBufIns(hbuf, ln, ipos); 
   stop;
}

if(ipos == 0) 
{
   preLine = GetBufLine(hbuf, ln-1);
   SetBufIns(hBuf, ln-1, strlen(preLine)-1);
}
else 
{
   SetBufIns(hBuf, ln, ipos-1); 
}
}

macro SuperCursorLeft()
{
moveleft(); 
if(IsComplexCharacter())
   moveleft();
}

//4、右移鍵——SuperCursorRight.em

macro moveRight() 
{
hwnd = GetCurrentWnd();
hbuf = GetCurrentBuf();
if (hbuf == 0)
        stop;   // empty buffer
ln = GetBufLnCur(hbuf); 
ipos = GetWndSelIchFirst(hwnd);
totalLn = GetBufLineCount(hbuf); 
text = GetBufLine(hbuf, ln);

if(GetBufSelText(hbuf) != "")   //選中文字
{
   ipos = GetWndSelIchLim(hwnd);
   ln = GetWndSelLnLast(hwnd);
   SetBufIns(hbuf, ln, ipos); 
   stop;
}

if(ipos == strlen(text)-1 && ln == totalLn-1) // 末行 
   stop;     

if(ipos == strlen(text)) 

   SetBufIns(hBuf, ln+1, 0);
}
else 
{
   SetBufIns(hBuf, ln, ipos+1); 
}
}

macro SuperCursorRight()
{
moveRight(); 
if(IsComplexCharacter()) // defined in SuperCursorLeft.em
   moveRight();
}

//5、shift+右移鍵——ShiftCursorRight.em

macro IsShiftRightComplexCharacter() 
{
hwnd = GetCurrentWnd();
hbuf = GetCurrentBuf();

if (hbuf == 0) 
   return 0;

selRec = GetWndSel(hwnd); 
pos = selRec.ichLim; 
ln = selRec.lnLast; 
text = GetBufLine(hbuf, ln); 
len = strlen(text);

if(len == 0 || len < pos)
   return 1;

//Msg("@[email protected];@[email protected];"); 
if(pos > 0) 
{
   i=pos;
   count=0; 
   while(AsciiFromChar(text[i-1]) >= 160)
   { 
    i = i - 1;
    count = count+1;   
    if(i == 0) 
     break;    
   }

   if((count/2)*2==count|| count==0)
    return 0;
   else
    return 1;
}

return 0;
}

macro shiftMoveRight() 
{
hwnd = GetCurrentWnd();
hbuf = GetCurrentBuf();
if (hbuf == 0)
        stop;   
        
ln = GetBufLnCur(hbuf); 
ipos = GetWndSelIchFirst(hwnd);
totalLn = GetBufLineCount(hbuf); 
text = GetBufLine(hbuf, ln); 
selRec = GetWndSel(hwnd);  

curLen = GetBufLineLength(hbuf, selRec.lnLast); 
if(selRec.ichLim == curLen+1 || curLen == 0)

   if(selRec.lnLast == totalLn -1)
    stop;

   selRec.lnLast = selRec.lnLast + 1; 
   selRec.ichLim = 1;
   SetWndSel(hwnd, selRec);
   if(IsShiftRightComplexCharacter())
    shiftMoveRight();
   stop;
}

selRec.ichLim = selRec.ichLim+1;
SetWndSel(hwnd, selRec);
}

macro SuperShiftCursorRight()
{        
if(IsComplexCharacter())
   SuperCursorRight();

shiftMoveRight(); 
if(IsShiftRightComplexCharacter())
   shiftMoveRight();
}

//6、shift+左移鍵——ShiftCursorLeft.em

macro IsShiftLeftComplexCharacter() 
{
hwnd = GetCurrentWnd();
hbuf = GetCurrentBuf();

if (hbuf == 0) 
   return 0;

selRec = GetWndSel(hwnd); 
pos = selRec.ichFirst; 
ln = selRec.lnFirst; 
text = GetBufLine(hbuf, ln); 
len = strlen(text);

if(len == 0 || len < pos)
   return 1;

//Msg("@[email protected];@[email protected];"); 
if(pos > 0) 
{
   i=pos;
   count=0; 
   while(AsciiFromChar(text[i-1]) >= 160)
   { 
    i = i - 1;
    count = count+1;   
    if(i == 0) 
     break;    
   }

   if((count/2)*2==count|| count==0)
    return 0;
   else
    return 1;
}

return 0;
}

macro shiftMoveLeft() 
{
hwnd = GetCurrentWnd();
hbuf = GetCurrentBuf();
if (hbuf == 0)
        stop;   
        
ln = GetBufLnCur(hbuf); 
ipos = GetWndSelIchFirst(hwnd);
totalLn = GetBufLineCount(hbuf); 
text = GetBufLine(hbuf, ln); 
selRec = GetWndSel(hwnd);  

//curLen = GetBufLineLength(hbuf, selRec.lnFirst);
//Msg("@[email protected];@[email protected]");
if(selRec.ichFirst == 0)

   if(selRec.lnFirst == 0)
    stop; 

   selRec.lnFirst = selRec.lnFirst - 1;
   selRec.ichFirst = GetBufLineLength(hbuf, selRec.lnFirst)-1;
   SetWndSel(hwnd, selRec);
   if(IsShiftLeftComplexCharacter())
    shiftMoveLeft();
   stop;
}

selRec.ichFirst = selRec.ichFirst-1;
SetWndSel(hwnd, selRec);
}

macro SuperShiftCursorLeft()
{
if(IsComplexCharacter())
   SuperCursorLeft();

shiftMoveLeft(); 
if(IsShiftLeftComplexCharacter())
   shiftMoveLeft();
}

============================================================================

Source Insight技巧收集


1、背景色選擇
    要改變背景色Options->preference->windows background->color設定背景色
2、解決字元等寬對齊問題。
    SIS預設字型是VERDANA,很漂亮。這網頁上應該也是用的VERDANA字型。但由於美觀的緣故,VERDANA字型是不等寬的。比如下面兩行
    llllllllll
    MMMMMMMMMM
    同樣10個字元,長度差多了.用VERDANA來看程式,有些本應該對齊的就歪了。解放方法是使用等寬的字型,但肯定比較醜。比較推薦的是用Courier New。
3、解決TAB鍵縮排問題
    Options-> Document Options裡面的右下角Editing Options欄裡,把Expand tabs勾起來,然後確定。OK,現在TAB鍵的縮排和四個空格的縮排在SIS裡面看起來就對齊咯

4、SI中的自動對齊設定:
    在C程式裡, 如果遇到行末沒有分號的語句,如IF, WHILE, SWITCH等, 寫到該行末按回車,則新行自動相對上一行縮排兩列。
    Option->Document option下的Auto Indient中Auto Indient Type有三種類型 None,Simple,Smart。個人推薦選用Simple型別。
5、向專案中新增檔案時,只新增特定型別的檔案(檔案型別過濾器)
    編輯彙編程式碼時,在SIS裡建立PROJECT並ADD TREE的時候,根據預設設定並不會把該TREE裡面所有彙編檔案都包含進來
    只加了.inc和.asm字尾的,.s字尾的沒有。而且用SIS開啟.s的檔案,一片黑白沒有色彩,感覺回到DOS的EDIT時代了……
    解決方法是在Options->Document Options裡面,點左上的Document Type下拉選單,選擇x86 Asm Source File,
    然後在右邊的File filter裡*.asm;*.inc;的後面加上*.s;接著CLOSE就可以了。
    上面問題解決了,但注意加入*.s後還需要重新ADD TREE一遍才能把這些彙編加到PROJECT裡面。
6、新增檔案型別
    使用者可以定義自己的型別,Options->Document Options->add type,定義檔案型別名以及檔名字尾。
    勾選include when adding to projects在新增目錄下檔案到工程是該類檔案就會新增進SI的工程。
    如果需要將所有檔案新增進SI的工程,可以定義一種檔案型別*.*。
7、恢復ctrl+a的全選功能
    通過關鍵詞save 找到save all,更改為ctrl+shift+a,通過關鍵詞select找到select all,更改為ctrl +a


Source Insight常用的快捷鍵:
    Ctrl+= :Jump to definition
    Alt+/ :Look up reference
    F3 : search backward
    F4 : search forward
    F5: go to Line
    F7 :Look up symbols
    F8 :Look up local symbols
    F9 :Ident left
    F10 :Ident right
    Alt+, :Jump backword
    Alt+. : Jump forward
    Shift+F3 : search the word under cusor backward
    Shift+F4 : search the word under cusor forward
    F12 : incremental search
    Shift+Ctrl+f: search in project
    shift+F8 : hilight word

Source Insight的視窗操作:
    project window Ctrl+O開啟
    symbol window Alt+F8開啟和關閉
    Contex Window 自定義鍵開啟和關閉
    Relation Window 自定義鍵開啟 先鎖定再重新整理聯絡

在Source Insight中新增自定義功能的步驟如下:
1.Source Insight中,Options->Custom Commands...->Add...,New Command name 隨便寫,我的是"Edit with Vim"
2.Run中寫入: "C:\Program Files\Vim\vim63\gvim.exe" --remote-silent +%l %f
意思是在當前已經開啟的gvim窗口裡面開啟當前的檔案,並且跳轉到指定行
%l為當前的行號,%f為檔名
使用 --remote-silent 的作用是,如果已經打開了對應檔案,就不會開啟第二次,而是在已經開啟的檔案裡跳轉到對應行
3.還是同一個對話方塊裡面,選擇Keys->Assign New Key...->按F12,如果你已經將F12設定給其他命令,選擇其他的按鍵就行了

下面是一些常用自定義功能:( CUSTOM COMMANDS )

開啟資源管理器並選中當前檔案
ShellExecute open explorer /e,/select,%f
檢視log
"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:log /path:%f /notempfile /closeonend
diff
"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:diff /path:%f /notempfile /closeonend
取得鎖定(check out)
"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:lock /path:%f /notempfile /closeonend
提交(check in)
"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:commit /path:%f /notempfile /closeonend
更新(update)
"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:update /path:%f /notempfile /closeonend
更新整個目錄(update all)
"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:update /path:*.* /notempfile /closeonend
取消鎖定(undo check out)
"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:revert /path:%f /notempfile /closeonend
在ultriEdit中編輯
"C:\Program Files\UltraEdit-32/uedit32" %f
在vim中編輯並定位到當前行
"C:\Program Files\Vim\vim63\gvim.exe" --remote-silent +%l %f

彙總其他小技巧:

讓{ 和 } 不縮排:

Options->Document Options->Auto Indent->Indent Open Brace/Indent Close Brace

hao space: SourceInsight 小技巧
1、按住"ctrl", 再用滑鼠指向某個變數,點選一下,就能進入這個變數的定義。

2、今天把一個用sourceinsight排版整齊的C檔案,偶然用VC開啟一看,全亂了。研究了半天,發現SI對每個字元的寬度不太一致。
    請教同事發現選上"view --> draft view", 就可以讓每個字元的寬度一致了。快捷鍵是 "Alt + F12"

3、"shift+F8" 標亮所有文字中游標所在位置的單詞

4、跳到某一行:"ctrl + g"

Source Insight是閱讀和編寫程式碼的好東東,基本上也算得上是經典之作了,雖然還有一點點小bug,不過對於我們這些C程式設計師來說可是一旦擁有別無所求。下列小技巧是在工作中同事整理總結的,對提高工作效率多少有點幫助,其中有些是對應於SVN的,沒有使用SVN做版本管理的人就不要白費力氣了。

ShellExecute open explorer /e,/select,%f
        /*作用是在資源管理器中開啟當前編輯檔案並選中*/
        /*可以設定快捷鍵如ctrl+e,這樣能很方便的在資源管理器開啟對應的檔案,並進行tortoiseSVN的相關操作*/

X:\Progra~1\TortoiseSVN\bin\TortoiseProc.exe /command:log /path:% /notempfile /closeonend
        /*使用前注意更改對應的bin安裝路徑*/
        /*作用是直接檢視當前檔案的svn log*/
        /*可以設定快捷鍵如ctrl+l*/

X:\Progra~1\TortoiseSVN\bin\TortoiseProc.exe /command:diff /path:% /notempfile /closeonend
        /*使用前注意更改對應的bin安裝路徑*/
        /*作用是直接檢視當前檔案和基準版本的比較*/
        /*可以設定快捷鍵如ctrl+d*/

                                       Source Insight中的檔案過濾器

遇到在新建工程的時候,需要加入一些除了.c .h 等之外的檔案,比如.s,.scf ,Makefile和ReleaseNotes等檔案,而每次新建工程的時候,即使取消了shown only known document types,和在點選Add All之後選擇了Recusively add lower sub-directories ,也還是不能正常識別這類檔案,也就不能加入進工程,只能我們自己手動雙擊新增到工程中,如果檔案少還無所謂,但是包含了很多子資料夾的大工程,這樣實在不可行。

百度了下,終於發現解決辦法了:

開啟Source Insight,在新建工程之前,進入

Options -> Document Options... Alt-T    -> 點選Document Type的下拉框,然後選擇Make File,在右邊的File Filter中,在原先的*.mak後面加上一個分號,即多個不同過濾規則以分號間隔開,再加上*makefile,變成 *.mak;*makefile,並且選中Include when adding to projects,這樣,以後再新建工程的時候,就可以識別makefile或Makefile了(好像此處Source Insight並不區分大小寫)。

類似的原理,給其他你想要加入的不同的型別的檔案,分別加入到原先的一些檔案型別後面,注意要用分號隔開,或者直接新建一個檔案型別,然後寫上對應的顧慮規則,比如

點選 Add Type,填入新檔案型別的名字Scatter File,File Filter中寫上*.scf,注意再選中下面的Include when adding to projects,這樣就建立了一個新的檔案型別, 以後新建工程加入檔案時候,系統就能夠識別字尾是scf的檔案了。

當然感興趣的,還可以對你新建立的檔案型別進行一些格式化設定。包括Parsing,Tab等等設定。