顯示具有 -Notes- 標籤的文章。 顯示所有文章
顯示具有 -Notes- 標籤的文章。 顯示所有文章

2012年3月9日 星期五

Introduction of GCC Compiler

對軟體工程師來說,使用 GCC 編譯程式碼是一項基本的技能,GCC 可說與我們的工作內容密不可分,以下就 GCC 的大致功能做一些簡單的整理:
(主要內容參考自 MAXSOLAR'S LINUX BLOG - Makefile 範例教學)
  • 傳統的編譯方式
  • gcc foo.c -o foo
    可在拆解成如下的動作:
    gcc foo.c -c
    gcc foo.o -o foo
    • 編譯的過程是將原始碼(foo.c)先使用 -c 參數編譯成 Object file(foo.o),然後鏈結一個函式庫成為二進位檔(binary)如下。[-c : Compile]
    • gcc foo1.c $SACLIB/sacio.a -O3 -g -Wall -ansi -o foo1
    • 接下來有更多 Makefile 的參數出現了,一一介紹如下:
      • -c:編譯但不進行鏈結,會產生一個跟原始碼相同名稱但副檔名為.o的目的檔。
      • -O:表示最佳化的程度,-O預設就是-O1,可以指定成-O2或-O3,數字越大表示最佳化程度越好,但是會增加編譯時間。
      • -g:把偵錯資訊也編譯進去,當你有需要使用GDB軟體進行偵錯,必須加入-g使GDB能夠讀取。一般情況下可以不用-g,因為它也會增加binary大小。
      • -Wall:顯示警告訊息,使用這個參數會在編譯時顯示更多的警告訊息。這個參數相當有用,特別是找不到 libs/headers 之類的問題。
      • -ansi:使用相容ANSI標準的編譯方式,ANSI 是 American National Standards Institute,即美國國家標準學會的簡稱。-ansi 可以增加程式的可移植性。
      • $SACLIB:是一個路徑變數名稱,必須被指定正確的值。執行這個命令前必須先確定這個變數是有被指派到正確路徑才行。.a 檔是一個靜態函式(static library),關於靜態跟共享的觀念稍候解釋。
    • 再來更多吧!假設今天要編譯 main 這隻程式,source codes 中有 main.c, foo.c, target.h,並且需要 /usr/local/moreFoo/lib/libpthread.so 這個共享函式,以及 /usr/local/moreFoo/include 裡面的 headers;這麼複雜的情況又該怎麼作呢?
    • gcc main.c foo.c -I /usr/local/moreFoo/include -L /usr/local/moreFoo/lib -lpthread -O3 -ansi -o main
      以上新出現的參數定義如下:
      • -I:需要 include 某些 headers 所在的目錄,通常 include 目錄都放置headers,利用-I使編譯器知道去哪裡找原始碼裡宣告的 header。gcc預設會去尋找headers的目錄大致有:
        • /usr/include
        • /usr/local/include
        • /usr/src/linux-headers-`uname -r`/include
        • /usr/lib/gcc/i486-linux-gnu/UR_GCC_VERSION/include
        • Current Dictionary
        因此,當原始碼內有宣告 #include <fakeFoo.h>,但 fakeFoo.h 並不在上述的資料夾內,就需要利用 -I 引導 gcc 找到它。至於 target.h 因為在當前目錄,因此不必額外宣告。當然,也可以利用多個 -I 來指定多個 headers 的路徑。
      • -l:表示編譯過程需要一個 library。-lpthread 代表需要一個名為 libpthread.so的函式。
      • -L:需要額外鏈結函式庫所在的目錄,有時候程式碼經常會呼叫一些函數(methods, functions 或是 subroutines),而這些函數是使用其他人預先寫好的、已經編譯成函式(例如 libpthread.so )供人使用的話,我們就不必自己從頭寫過。gcc 預設會去找函式的目錄大致有:
        • /lib
        • /usr/lib
        • /lib/modules/`uname -r`/kernel/lib
        • /usr/src/linux-headers-`uname -r`/lib
        • /usr/local/lib
        • Current Dictionary
        因此編譯時,利用-L指定目錄告訴編譯器可以該路徑下尋找 libpthread.so。因此,若使用了-l,則必須確定所使用的 library 有在預設尋找的目錄中,否則就必須利用-L來指定路徑給編譯器。當然,可以利用多個-L來指定多個 libraries路徑。
  • 靜態、共享與動態鏈結函式庫
  • 輪子不必重複發明 -- 人家寫好的方法我們可以直接拿來用。不過很多時候,這些方法可能因為某些因素,希望提供給別人使用卻又不希望公佈原始碼,這時候編譯成 libraries 是最好的選擇。
    • 靜態函式(static libraries)
    • 靜態函式其實就是將一系列 .o 檔打包起來,因此它可以直接視為一個巨大的 .o 檔。打造出一個靜態函式的方法很簡單:
      gcc operator.c -c
      ar crsv liboperator.a operator.o
      或者
      gcc -static operator.c -loperator
      兩種方法皆能產生 liboperator.a。假設這個靜態函式在 /usr/local/foo/lib/ 裡,編譯時要與靜態函式作鏈結也很容易:
      gcc main.c /usr/local/foo/lib/liboperator.a -o main
      把靜態函式當成一般的 .o 檔一起納入 binary,也可以像這樣:
      gcc main.c -L /usr/local/foo/lib -loperator -o main
      靜態函式將所有的功能全部打包在一起,因此 binary 會變得很巨大,但是執行這個程式的所有功能都已滿足,不會再有 libraries 相依性的問題。但是缺點在於當某些libraries的功能有所更新時,這個程式就必須重新編譯,無法享受到即時更新的優點。通常商業軟體以及嵌入式系統等功能異動較少的程式,會傾向使用靜態函式。
    • 共享函式(shared libraries)
    • 共享函式跟靜態函式的觀念剛好相反,程式在執行時必須能夠找到相依的函式,否則執行時會出現錯誤訊息。製作一個共享函式的方法也很簡單:
      gcc -shared operator.c -o liboperator.so
      或是先編譯出目的檔再進行鏈結:
      gcc -c operator.c
      gcc -shared operator.o -o liboperator.so
      產生出 liboperator.so。假設這個共享函式在 /usr/local/foo/lib/ 裡,使用共享函式進行鏈結也很容易:
      gcc main.c /usr/local/foo/lib/liboperator.so -o main
      也可以像這樣:
      gcc main.c -L /usr/local/foo/lib -loperator -o main
      共享函式在程式啟動時期會檢查是否存在。以一個分別鏈結了靜態函式與共享函式的 binary 而言,執行的結果大有差別。以靜態函式鏈結的 main 程式可以順利執行,但是假設系統預設尋找函式庫的路徑裡找不到 liboperator.so,以共享函式鏈結的main程式則會出現錯誤訊息:
      ./main: error while loading shared libraries: liboperator.so: cannot open shared object file: No such file or directory
      這時解決的方法有四種:
      1. 把 liboperator.so 複製或是作一個連結到 /usr/lib 裡。
      2. 修改 /etc/ld.so.conf,把 /usr/local/foo/lib 加進系統 libraries 的搜尋範圍內。
      3. 設定 LD_LIBRARY_PATH 變數,累加該路徑進來:如果你不是系統管理員,前兩個方法根本沒辦法執行。我們只好自己加到 ~/.profile 裡:
      4. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/foo/lib
      5. 改用靜態函式進行鏈結。
      共享函式經常出現在開放原始碼的 linux 世界裡,由於使用所有函式皆是共享的,因此許多程式都可以重複利用既有的功能;有新功能或是 bug 也能簡單的替換掉該函式,所有程式都可以即時享受到這樣的改變,也是最為常見的函式型態。
    • 動態函式(dynamic libraries)
    • 動態函式跟共享函式非常類似,唯一的差別在於程式執行時期並不會去檢查該函式是否存在,而是程式執行到某功能時才進行檢查。這種動態載入的技術最常用在瀏覽器或是大型程式的外掛程式,當有需要用到這個功能時才載入進來。而製作一個動態函式較為麻煩。
      gcc -c -fPIC operator.c
      gcc -shared operator.o -o liboperator.so
      其中的 -fPIC 是產生 position-independent code,也可以用 -fpic,撰寫呼叫動態函式的程式碼也需要傳入相關參數。

2012年3月1日 星期四

CGI Overview (Based on C++)

CGI (Common Gateway Interface) Overview
  • CGI 的角色定位
  • C++ Output
    • 如果我們想要利用 C++ 在畫面上呈現出"Hello World!"的字串,我們通常會用下列的程式碼:
    • 但是如果是想要在瀏覽器上呈現出"Hello World!"的頁面,我們還有更多動作需要做,這時就需要 CGI 的支援。
  • Content-Type Header
    • 每一個 CGI Script 都必須優先輸出以 MIME 形式表示的 Content-Type Header,舉例來說:text/plain 表示純文字內容輸出;text/html 表示一個 HTML 的網頁。實際上的程式碼可能是如下所示:
  • First Simple CGI Script
    • 如上所言,我們可以簡單的寫出一個 CGI Script 如下:
    • 為使它更符合標準的網頁結構,並善用 HTML 所提供的 Tag 來美化它,可將其改為如此。
    • 如此一來,瀏覽器便能正確的解析它的內容。
  • Using HTTPd Environment Variables
    • 當我們在伺服器上利用 HTTPd Server 執行 CGI Script ,HTTPd Server 會利用許多環境變數來存放資料,我們可以用 getenv() 來取用這些環境變數,以下就以取得 Client IP address 的 CGI Script 做示範。
    • 你也可以秀出當前時間或是顯示使用者的瀏覽器類型(利用 HTTP_USER_AGENT 參數)
  • Receiving Data From Form
    • 接下來介紹使用 Http "POST" 的方式進行資料傳遞,CGI Script 可透過 STDIN 取得Data,當 HTTPd 收到資料後會先放在一塊輸入緩衝區,並將資料大小紀錄在CONTENT_LENGTH (環境變數),再以 CGI 程式的 STDIN 指向此塊緩衝區,在 C++ 下最簡單的方法是透過 fread() function 取得資料。
    • 下面用一個 HTML <FORM> 來說明 POST 資料的運作過程:
    • 當使用者送出這個表單,CGI Script 將透過 STDIN 收到以下的資料。
    • value1=test1&value2=test2&value3=test3
    • CGI Script 接收資料並回覆的程式碼內容可能如下:
  • Parsing The Form Data
    • 這裡有兩個關於CGI Library的檔案,接下來我們會使用到它們內部的函式跟功能,它們提供兩個 Classes: CCGI 跟 CCGItem,可以更方便的處理資料。
    • 以下是它們的運作方式:建立一個 CCGI 跟 CCGItem,呼叫 CCGI::Load() 來讀取資料,接著呼叫 CCGI::GetItemCount() 來取得被送出的數量,然後利用 CCGI::GetItem 來取得資料,以一個指標指向已填入相對應 item name & value 的 CCGItem ,呼叫 GetName() 以及 GetValue() 進行資料取用。請參考如下的程式碼:
現在你應該對於 CGI based on C++ 有了基本的認識,接下來你可以嘗試寫更有用且具有互動性的 CGI 程式。

2011年11月30日 星期三

[VIM] encoding , fileencoding , and fileencodings


  • encoding
    • 為vim內部、緩衝區、選單等所使用的編碼,如果 enc 不另外設置(比方在 .vimrc )的話, 則與 locale (或者說是 $LANG ) 一致,又如果 $LANG 為空值,則預設值為 latin1 。
  • fileencoding
    • 文字檔的實際編碼方式,如果打開文字檔案時,比對 encoding 與 fencoding 的值 不一樣的話,則會呼叫 iconv() 將 fencoding 所指定的編碼轉換成 encoding 一樣的編碼。 如果儲存該文字檔案時,比對 encoding 與 fencoding 的值不一樣的話,則會呼叫 iconv() 將 encoding 所指定的編碼轉換成 fencoding 一樣的編碼,與上相反。要注意,如果你的 fencoding 是 utf8 而你的 encoding 是 big5 的話,你要打開檔案時 utf8 編碼要轉成 big5 的話,如果你的內容上面有中文、日文、法文等多國的語言,從 utf8 轉成 big5 ,根本是有問題的,所以資料會有遺失的問題。 還有一點就是, fencoding 有時候會有誤判的問題,該值不正確的話可以使用 :e ++enc=big5 這類方式傳入,讓vim 重讀該檔,讓 fenc 強制使用 big5 編碼。(註:e 是 edit 的意思, ++enc 不是 enc 而是 fenc )
  • fileencodings
    • 是編輯文字檔案時,依照先後順序猜測該檔案所使用的編碼列表,filecoding 會先使用 fileencodings 裡面所猜到的編碼當作該值,如果 fileencodings 裡面都猜不到,也就是 fileencoding 是空值,即是使用 encoding 的值當作該值。由上面可以知道,如果在 ~/.vimrc 設定 fileencoding 的值,但是 vim 不一定會取用該值,因為不管 fileencodings 或是 encoding 都會覆蓋 fileencoding 所定義的值。所以說在~/.vimrc 設定 fileencoding 是為了指定在vim下開啟一個新檔案時所決定的編碼。
以上參考自隨便忘記[ Vim 設定中的 encoding 和 fileencoding ]

2011年11月17日 星期四

GoAHead Web Server - introduction

  • GoAHead Web Server
    • ASP supported
    • embedded Javascript supported
    • extended API
    • standard CGI progress
    • form implementation (GoFrom) by CGI
    • few memory necessary: 60KB (no SSL), 500KB (with SSL)
    • multiple OS support: eCos, LINUX, LynxOS, QNX, VxWorks, WinCE, pSOS

  • 常用功能:
  • 以下檔案位置都於 goahead folder 之下展開
    • 自行建立並連結一個 CGI Form 的方法(以 OS-LINUX 為例)
    • find Definition @ form.c: websFormDefine(char_t *name, void (*fn)(webs_t wp, char_t *path, char_t *query))
      1. 於 LINUX/ 之下建立檔案 foo.c,實作 Form 處理函式:void fooForm(webs_t wp, chat_t *path, char_t *query)
      2. 於 LINUX/main.c 中建立程式連接,於 initWebs() 中加入:websFormDefine(T("form_name"), fooForm)
      3. fooForm 是定義的函式,form_name 是在使用 HTML Form 呼叫時使用的函式
        使用方式:

    • 自行建立並連結一個 CGI ASP API 的方法(以 OS-LINUX 為例)
    • find Definition @ asp.c: websAspDefine(char_t *name, int (*fn)(int ejid, webs_t wp, int argc, char_t **argv))
      1. 於 LINUX/ 之下建立檔案 foo.c,實作 ASP API 處理函式:int fooAspAPI(int eid, webs_t wp, int argc, char_t **argv)
      2. 於 LINUX/main.c 中建立程式連接,於 initWebs() 中加入:websAspDefine(T("api_name"), fooAspAPI)
      3. fooAspAPI 是定義的函式,api_name 是在使用 ASP 語法呼叫時使用的函式
        使用方式:

2011年9月21日 星期三

Build SDK - qt-everywhere-opensource-src-4.7.4 for ARM


How to Build SDK - qt-everywhere-opensource-src-4.7.4 for ARM

Prepare working - Dependency Libraries

(download them from official website)
1. tslib - https://github.com/kergoth/tslib
2. openssl-1.0.0e - http://www.openssl.org/source/
3. libpng-1.2.46 - http://www.libpng.org/pub/png/libpng.html

compile them and put them to your cross compiler library directory.


Building Qt-4.7.4 SDK

1. download Qt libraries 4.7.4 for embedded Linux (202 MB) from http://qt.nokia.com/downloads
2. extract file and enter the folder
3. If you want to compile some plugin libraries together, please put them into qt library plugin folder.
    (Qt library plugin folder  "./qt-everywhere-opensource-src-4.7.4-Embedded/src/plugins")
4. setting configure - my setting parameters
./configure -prefix /usr -xplatform qws/linux-arm-g++ -embedded arm -developer-build -opensource -confirm-license -fast -qt-sql-sqlite -no-qt3support -no-phonon -no-phonon-backend -qt-freetype -system-libpng -no-libmng -qt-libjpeg -no-rpath -no-nis -no-cups -separate-debug-info -openssl -no-opengl -little-endian -nomake examples -nomake demos -accessibility -plugin-gfx-liunxfb -plugin-mouse-tslib -L/usr/local/arm/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/lib/ -I/usr/local/arm/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/include -L/usr/local/arm/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/usr/lib/ -I/usr/local/arm/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/usr/include -D QT_KEYPAD_NAVIGATION -verbose
5. make
6. make install ( Qt will be installed into prefix path that you set )

2011年6月7日 星期二

porting tslib (abstraction layer for touchscreen) to ARM Platfrom

Step by Step:
my environment:
OS: Ubuntu 10.04
Cross-compiler:
  - CC   = linux-arm-gcc (4.1.2)
  - CXX = linux-arm-g++ (4.1.2)

  1. Download tslib source code
    • download tslib tar or zip file from http://tslib.berlios.de/
    • my download file version is named kergoth-tslib-1.0-94-gd4073fe.zip
  2. Install dependency libraries
    • sudo apt-get install m4 autoconf automake libtool
  3. set tslib install path
    • export PREFIX=/home/myname/tslib/BUILD 
      #set INSTALL PATH by your choice
  4. execute autogen.sh
    • ./autogen.sh
    • After this command finished, it generates configure file for tslib.
  5. configure tslib
    • ./configure --build=i386-linux --host=arm-linux --target=arm --prefix=$PREFIX ac_cv_func_malloc_0_nonnull=yes
  6. make; make install

2010年10月22日 星期五

讓Putty能夠顯示中文字 in Ubuntu

在Ubuntu下,要讓Putty顯示中文字主要設定方式可分為兩個步驟

  • 設定Putty Translation編碼,如下圖所示
    1. 選擇 Translation >> Remote character set: UTF-8

  • 設定Putty window Fonts,如下圖所示
    1. 選擇 Fonts >> 按下 Font used for ordinary text (Change...)
    2. 選擇字型 "TlwgMono"

大功告成!


--- 特別感謝 David 技術教學 ---

2010年10月19日 星期二

Colorful man pages setting

  • Linux colorful man pages setting (for bash)
    • 開啟個人bash設定檔
    vi ~/.bashrc
  • 加入以下資料
  • # For colourful man pages
    export PAGER="`which less` -s"
    export BROWSER="$PAGER"
    export LESS_TERMCAP_mb=$'\E[01;34m'
    export LESS_TERMCAP_md=$'\E[01;34m'
    export LESS_TERMCAP_me=$'\E[0m'
    export LESS_TERMCAP_se=$'\E[0m'
    export LESS_TERMCAP_so=$'\E[01;44;33m'
    export LESS_TERMCAP_ue=$'\E[0m'
    export LESS_TERMCAP_us=$'\E[01;33m'
    
  • 讀取bash設定檔
  • source ~/.bashrc
  • 完成!

2010年5月25日 星期二

Some notes for symfony

View Template Shortcuts

  • $sf_context: The whole context object (instance of sfContext)
  • $sf_request: The request object (instance of sfRequest) 
  • $sf_params: Parameters of the request 
  • $sf_user: The current user session object (instance of sfUser)

      Get XML information in symfony 1.4

      When parse a remote xml file, I use sfWebBrowserPlugin and get the right result, like this way:

      in actions code
      $tar = new sfWebBrowser();
      $tar->post(url_for('MsgTransfer/Recommender', true), http_build_query($this->form->getValues()));
      $this->xml = $tar->getResponseXML(); 
      
      in template code
      php echo $xml->string;
      then i get the error message:
      Fatal error: Call to undefined method SimpleXMLElement::__toString() in /usr/share/php/symfony/escaper/sfOutputEscaperObjectDecorator.class.php on line 98

      The solution to solve is use:
      php echo $sf_data->getRaw('xml')->string;
      

      2010年5月19日 星期三

      UNIX 終端機色彩控制碼

      可以用於各種程式碼的輸出資訊顯示,包含C/C++、PHP、SHELL等,

      以PHP為例:
      echo "\033[40;31mHello!\n\033[0m";
      以C為例:
      printf("\033[40;31mHello!\n\033[0m");

      標準格式:
      \033[背景色碼;文字色碼m String here \033[0m

      背景色碼範圍:40~47
      • 40:
      • 41:深紅
      • 42:
      • 43:
      • 44:
      • 45:
      • 46:深綠
      • 47:白
      文字色碼範圍:30~37
      • 30:黑
      • 31:
      • 32:
      • 33:
      • 34:
      • 35:
      • 36:深綠
      • 37:
      特效屬性控制碼:
      • \33[0m:關閉所有屬性
      • \33[1m:設置高亮度
      • \33[4m:設置下底線
      • \33[5m:文字閃爍
      • \33[7m:反顯示(開燈)
      • \33[8m:消隱
      更詳細資訊可參考:教您如何在BBS介面上利用色碼上色 from NCTU-Wiki

      2009年8月3日 星期一

      Unix 系統切換開機進入文字或 X-windows 模式

      Red Hat、 Fedora、Mandruke 或 Mandriv

      /etc/inittab 中包括":initdefault"一行,更改"id:"和":initdefault:"之間的數字。
      如果你想開機自動進入文字模式,轉為3。
      如果你想開機自動進入圖像(X Window)模式,轉為5。
      id:3:initdefault
      所有Unix/Linux都有最少0-6七個run level,不同run level代表不同執行模式。 Red Hat等定了run level 3為文字模式,而run level 5為 X-Window圖像模式。 inittab中的initdefault控制了開始預設進入那個run level, 所以改變這個數值就可以切換開機自動進入那個模式。

      Debian 或 Ubuntu

      Debian或Ubuntu是利用SysVinit啟動X Display Manager,亦即是所謂的圖像模式登入畫面。
      只要你安裝任何一個X-Display Manager(包括xdm、gdm、kdm和wdm),
      系統開機時就會自動執行,進入圖像模式。如果你想開機自動進入文字模式,
      你可以選擇移除所有X-Display Manager。
      
      apt-get remove xdm gdm kdm wdm
      或者關閉開機自動啟動任何一個 X Display Manager。

      2008年10月13日 星期一

      (FreeBSD) 編輯器 About VIM!

      1. cd /usr/ports/editors/vim

      2. make -DWITHOUT_X11 install clean # 僅安裝文字版的 vim

      3. 在/root下 編輯 .vimrc # 新增喜好設定檔

      4. 建議配置
        set cindent
        set enc=taiwan
        set fileencoding=taiwan
        set hls
        set nocompatible                             # 方向鍵不會出現英文
        set sw=2
        set guifontset=8x16,kc15f,-*-16-*-big5-0     # 設定 zh_TW.Big5 locale
        syntax on
        highlight Comment ctermfg=darkcyan
        highlight Search term=reverse ctermbg=4 ctermfg=7
      
      6. cp .vimrc /home/username
      # 將 .vimrc 設定檔拷貝給現有使用者

      7. cp .vimrc /usr/share/skel/dot.vimrc
      # 日後新增帳號自動複製


      * 以 tcsh 為例:

       使用者登入後,會讀取 /etc/csh.cshrc & /etc/csh.login

       1. vi /etc/csh.cshrc

       2. setenv EDITOR vim # 預設文字編輯器改成 vim
         alias vi vim # 輸入 vi 時,會使用 vim 當作編輯器

       3. vi /etc/csh.login

       4. setenv ENABLE_STARTUP_LOCALE zh_TW.Big5 # 遠端能輸入中文
         setenv LC_CTYPE is_IS.ISO8859-1
         # 4.x is_IS.ISO_8859-1
         # 5.x is_IS.ISO8859-1
         setenv LANG zh_TW.Big5 # console 下輸入中文

       5. /usr/share/skel/dot.cshrc & dot.login

        # 可加入上面的設定,作為日後新增帳號的設定。

       6. 如果覺得字色太暗,可在 .vimrc 中加入 set background=dark

      2008年9月18日 星期四

      (FreeBSD) 彩色編輯器 VIM!!

      步驟一: 使用ports安裝vim
      # cd /usr/ports/editors/vim
      # make install clean

      步驟二:
      # cp /usr/local/share/vim/vim62/vimrc_example.vim ~/.vimrc

      步驟三:(csh使用者)
      修改 /etc/csh.cshrc
      alias vim env TERM=xterm-color vim

      如有特別需求, 再修改 ~/.vimrc 即可

      .vimrc

      set fileencoding=taiwan
      set guifontset=8x16,kc15f,-*-16-*-big5-0

      並且設定 zh_TW.Big5 的 locale,這樣子就可以一次刪除一個中文字。

      set cindent

      set cindentset enc=taiwan
      set fileencoding=taiwan
      set hls
      set nocompatible
      set sw=2
      syntax on
      highlight Comment ctermfg=darkcyan
      highlight Search term=reverse ctermbg=4 ctermfg=7

      啟動的時候建議使用 env TERM=xterm-color vim 這樣漂亮的顏色就會出來!
      覺得字色太暗,可以用:
      set background=dark

      2008年9月16日 星期二

      (FreeBSD) 有Gunls,給我彩色人生!!!

      步驟一: 使用ports安裝gunls
      # cd /usr/ports/misc/gnuls
      # make install clean

      步驟二:
      [~/.cshrc]增加

      alias ls 'gnuls --color --show-control-chars'