實現代碼編輯器

    上一次曾經發布過一篇如何實現一個代碼編輯器。今年工做中得空,因此對這個編輯器進一步作了些更新,把名字改爲了從CuteC改爲了CEditor。主要是重寫了軟件的界面(最終還原樸素),重寫了編輯控件語法高亮的着色方式,還有增長了一個簡單的SSH客戶端和SFTP文件編輯的功能。感受基本的功能已經實現了,因此再次寫點東西記錄一下。而且發佈一下編輯控件的源代碼,有興趣的可下載下來看看,雖然代碼寫得比較亂。
    上個版本:http://www.cnblogs.com/linxr/archive/2011/10/30/2229256.html
    編輯控件源碼連接:http://files.cnblogs.com/linxr/LEdit.rar
    軟件下載連接:http://files.cnblogs.com/linxr/CEditor.rar
    軟件界面:
        html


1、編輯控件
 除了上一次寫到的一些內容外,主要在編輯控件的語法高亮上作了修改。
 1. 原來的顏色信息是在繪製每行時,動態分詞查找關鍵字,造成一個顏色數組供繪製模塊使用。這種方式的優勢就是邏輯簡單,繪製代碼很容易編寫。可是缺點就是,每次繪製一行,都要從新產生顏色數組,影響效率;其二,在一些場合下,高亮不是依賴於關鍵字,這時候這種方法就無能爲力了。
 2. 考慮到上面的缺點,對編輯控件作了修改。去除了顏色數組,改用標註信息來標註顏色字體信息。因此行數據通過着色以後再也不是原來的內容了。
 
    例如一行數據:
    int main( int argc, char ** argv );
    那麼通過着色後,該行的數據會變成:
    \ec3,0~int\ezc~ main( \ec3,0~int\ezc~ argc, \ec3,0~char\ezc~ ** argv );
    其中,int和char被着色,標註信息爲:
    \ec3,0~ 和 \ezc~
    着色信息以\e(0x1b)開始,以~結束。c表示顏色,z表示還原格式格式。
    
     着色完成後,繪製模塊在進行繪製文本信息時,從頭至尾,掃描字符串,根據着色信息,不斷的設置還原DC的顏色信息,直到繪製完成。
 3. 標註顏色帶來了一些額外的問題,主要表如今:
    a.光標位置到字符串中的位置的轉換的計算。
    b.獲取編輯器的內容時,要清除全部的標註信息,影響必定的性能。
    c.計算tab鍵的寬度時,不能用tab鍵在字符串中的位置來計算,要考慮標註信息。
    d.光標在屏幕中的位置的計算,要根據光標前面數據的字體來實時計算寬度。
 
2、函數列表
    對於代碼編輯軟件來講,函數符號列表功能是必備的,就算是純寫C的人來講,有一個函數列表會大大提升滾動查找代碼的效率。我雖然寫了一個C語言的解釋器,對符號的解析稍做修改就能夠實現,可是各類各樣的語言,我就無能爲力了。好在有ctags.exe,他能夠支持很是的語言符號分析。我仍是直接拿來用吧,而後再加上一個樹形控件,就能實現簡單實用的功能。
    我調用ctags.exe的代碼片斷,主要是調用了ctags.exe,將結果保存到一個文件,而後咱們再解析這個文件:
   
 CString strParam;
 CString strTags = strFilePath + _T(".tags.txt");
 strParam.Format( _T("-f \"%s\" --language-force=C++ -n \"%s\"" ), strTags.GetBuffer(0), strFilePath.GetBuffer(0) );windows

 SHELLEXECUTEINFO   sei;
 ZeroMemory( &sei, sizeof(SHELLEXECUTEINFO) );
 sei.cbSize = sizeof(SHELLEXECUTEINFO);
 sei.fMask = SEE_MASK_NOCLOSEPROCESS;
 sei.hwnd = NULL;
 sei.lpVerb = NULL;
 sei.lpFile = "ctags.exe";
 sei.lpParameters = strParam.GetBuffer(0);
 sei.lpDirectory = CLxrFile::GetExecutePath().GetBuffer(0);
 sei.nShow = SW_HIDE;
 sei.hInstApp = NULL;
 ShellExecuteEx(&sei);
 WaitForSingleObject( sei.hProcess, INFINITE );
 /*
 ** 能夠看到就是調用了ShellExecuteEx,可是有幾個地方能夠提一下:
 ** 1. sei.nShow = SW_HIDE; 這使得進程啓動時不會顯示控制檯窗口。
 ** 2. WaitForSingleObject( sei.hProcess, INFINITE );
 **    等待進程結束,這個很重要,否則ctags啓動後,咱們沒法同步獲取結果。
 */
 
    
    ctags.exe支持的語言,能夠用命令 ctags.exe --list-languages 查看:
        Asm
        Asp
        Awk
        Basic
        BETA
        C
        C++
        C#
        Cobol
        Eiffel
        Erlang
        Fortran
        HTML
        Java
        JavaScript
        Lisp
        Lua
        Make
        Pascal
        Perl
        PHP
        Python
        REXX
        Ruby
        Scheme
        Sh
        SLang
        SML
        SQL
        Tcl
        Vera
        Verilog
        Vim
        YACC
    能夠看到,他幾乎涵蓋了全部流行的語言,而他的執行文件大小隻有256kb,太強悍了,讓我很是的佩服。api

3、腳本管理
    讓編輯軟件支持腳本是必要的,不只僅能夠對經常使用的功能提供擴展。我實現了類C的解析執行,因此對簡單的計算功能,軟件的功能,都能給外部腳本提供接口函數,讓腳本輕鬆的操做編輯器,或者作一些好玩的事情。我主要作的是將腳本直接映射到右鍵菜單,當添加一個腳本時,他將直接被添加進右鍵菜單。而且支持多級目錄。
    例如,我實現了幾個接口供腳本使用:
    
  int ceditor_exe_2( char * cmd, char * out );
  該函數用於執行cmd指令,out爲輸出結果。cmd爲編輯器的的命令,形如rep_sel$hello world$。
  int ceditor_exe_4( char * cmd, char * p1, char *p2, char * out );
  該函數效果同ceditor_exe_2,可是cmd僅是命令,p1,p2分別是兩個參數。
  int clear();
  該函數用於清除輸出框的內容。
  int ceditor_hotkey( char * ctrlKeys, int vKey, char * scriptPath );
  該函數用於註冊熱鍵。數組

    C的解釋器,你們能夠看我之前發過的文章,代碼能夠在CSDN上面找到,搜索"xrc C語言解釋器"就能找到,或者試試這個連接:http://download.csdn.net/download/linxren/4204728。在cnblogs上能夠看看相關的實現方法,算是講得比較清楚的吧。
   
4、數據存儲
    數據存儲在不一樣的軟件中都必須用到,我這裏主要是配置的存儲和腳本的存儲,正好我寫了個key-value存儲系統,因此這個直接拿來用就很是合適了,效率也不錯。跟直接讀寫硬盤沒什麼區別,省去了煩人的fopen,fread,fwrite,fclose調用,直接用windows的api更是煩人,因此寫這樣一個簡單的庫,很是方便。
    http://www.cnblogs.com/linxr/p/3252541.html,在這裏能夠看到實現方法和下載到源代碼。我以爲這個簡單的key-value存儲庫,比我寫的解釋器,和這個編輯器自己更加實用,全部的軟件均可以用,接口也很簡單。沒法就是open,set,get,close四個函數。省去了文件操做的各類麻煩。編輯器

相關文章
相關標籤/搜索