如何在 Windows 中寫程式如同於 Linux 一般?

最近因為工作的需要,很多程式都得在 Windows 底下編譯、執行。這對於大二之後就再也沒有寫過任何 Windows 程式的我真的是綁手綁腳,怎麼用都不習慣。雖然我認為 Visual Studio 真的很強大很好用,但是很多時候我們並不需要這麼龐大的 IDE,殺雞焉用牛刀呢?這時候就會開始懷念起 Linux 底下的 Vim 與 GCC 了…

之前就知道 cygwin 可以在 Windows 底下創造出一個符合 POSIX 的系統(另外一套是 MinGW),但是一直沒有去使用,畢竟自己手邊的電腦不是 Mac 就是 Ubuntu。也因為沒有真正去使用的經驗,所以我一開始是以為他的功能並不是很完整,頂多就是堪用罷了。直到我把我在 Linux 的程式丟到 cygwin 執行後,才驚覺它的強大!因為我幾乎不用任何程式碼,就可以直接產生執行檔,除了可以在 cygwin 內執行之外,也可以順利的在其他 Windows 電腦上執行!

不過 cygwin 並不是沒有缺點的,最大的缺點就是它並沒有真正的套件管理系統。一旦缺什麼套件,你就得拿出當初下載下來的安裝檔重新安裝…雖然有點麻煩、裡面的套件也不若 Ubuntu’s APT 或是 Gentoo’s Portage 這麼多,但該有的幾乎都不少了。

接下來就開始來看看如何建構一個舒服的編程環境吧!

還我終端機!

在 Windows 上最不習慣的就是終端機了!嚴格來說應該是命令提示字元,除了只能使用 DOS 命令之外,複製貼上也不是普通的麻煩。也沒有上色功能,字體又醜,缺點真的是列不完…Orz

可見不是只有我有這個需求,所以 putty 的延伸 puttycyg 就誕生啦!簡單的來說就是在 SSH 以外增加了連線到本機 cygwin 環境的功能。這樣就可以直接使用到 putty 本身強大的終端機介面啦!加上 /cygdrive/ 的幫助之下,可以完成許多本來得在命令提示字元中才可以處理的事情。

準備好編譯環境

寫程式少不了編譯器、除錯器。安裝方式一樣,但是請注意安裝 cygwin 的 GCC 跟安裝在 Windows 的 GCC 是完全不同的東西,所以要先弄清楚自己是要在 POSIX 環境下進行編譯還是在命令提示字元底下。

gVim:要寫程式,少不了好用的編輯器!

當然,我們也可以透過上述安裝套件的方法,在 cygwin 中安裝 vim。但是我個人認為在 Windows 不同資料夾中做切換還是有點不方便(即使用了 putty 的終端機),這時候最需要的就是 vim 強大的 File navigation 套件:command-t。如此一來,搭配著 gVim,我們就可以直接在檔案總館中對檔案按下右鍵編輯,並且透過 command-t 在各個檔案間跳躍!

把舊有的 .vimrc .gvimrc 移植過來並不太費力,只要將不相容的刪除即可。但是安裝 command-t 可就有點麻煩了…

  1. 下載 gVim 7.2 與 ruby 1.87 (因為 vim 預先載入的是與 ruby 1.87 連結,所以我們必須下載對應的版本。如果下載 gVim 7.3,則是對應 ruby 1.91,但不建議,因為新版在與 ruby 配合這方便不是非常的穩定
  2. 確保 ruby 功能有開啟:gVim 7.2 以上的版本是預設開啟的,但是最後還是透過 :ruby 1 或是 vim –version 檢查一下。如果可以執行命令或是出現 +ruby 字眼,就沒有問題了。不然就只能下載原始碼自己重新編譯一份,可以參考這個網站的教學(已經跟現在版本有點出入,參考作法即可)。
  3. 剩下的就是編譯 command-t 的標準流程了: :e command-t.vba :so % $ cd ~/.vim/ruby/command-t $ ruby extconf.rb $ make
  4. 不過我在過程中還是會出現這樣的錯誤,最後我發現,這是因為所解壓縮而得到的 extconf.rb 中路徑設定有問題,把 C/Program Files/…/…/ 改回符合 Windows 格式的 C:\Program Files\…\… 即可,我想可能算是個小 bug。

版本管理系統:SVN, Git

其實,理論上這兩套系統也是可以直接安裝的,但是 Git 會一些問題。這是因為它在作業的時候會呼叫 fork() 來做下載動作,但是 fork() 這個函式是 Windows 所沒有的,而 cygwin 有其限制所在導致 Resources temporarily unavailable 錯誤產生,我個人是放棄打算透過 [GUI 版本](http://code.google.com/p/msysgit/)來使用 Git 了,不過如果還有興趣的朋友可以參考[這篇文章](http://old.nabble.com/Resource-Temporarily-Unavailable-workaround-td13899770.html)。
 

給我更多!

如果像我一樣,這樣還不滿足的朋友,在此提供一個小技巧,透過 /cygdrive/ 存取 explorer ,後面接著檔案或是資料夾名稱,就跟[其他 OS](http://www.howtogeek.com/howto/15781/open-a-file-browser-from-your-current-command-promptterminal-directory/) 一樣,可以直接在檔案總管中開啟終端機所在目錄位置。
接著,你可能會好奇,能不能直接從終端機切換到目前的工作目錄?cygwin 提供了一系列的好用工具中的 [cygpath](http://www.cygwin.com/cygwin-ug-net/using-utils.html),就可以達到這個功能:
cygpath -u "C:\Program Files\...\..."
注意雙引號千萬不可以少,否則會被當做逃脫字元而取代掉。
這樣下來,我想,以後在 Windows 寫程式應該快樂許多:D