Professional Documents
Culture Documents
org)
《用 vim 寫程式快 n 倍》
作者:Anthony <ypwong@ypwong.org>
Learn vi in 3 minutes...
* 「指令」與「輸入模式」之切換:
* 存檔並離開程式:
* 於指令模式移動:
* 刪去浮標上之字元:
已經學完 vi 了,就是這麼簡單。
Programmer 的 vim
vi 由當初一個簡單的編輯器慢慢發展,不斷加入新元素,不過在過程中亦無可避免地產生了一些由 vi 分支出
來的程式,例如 elvis, levee, nvi 及 vim 等,而 vim (Vi IMproved) 亦名副其實地成為最出色的 vi 繼承者。vim 的
開發工作一直也很熱鬧,新功能還不斷地在增加。好吧!現在我就假設你是個已經用了 vim 一段時間的用者,
知道甚麼是 .vimrc 和 vim 的 option,以下我就會讓你目睹 vim 用在編寫程式時的威力,好讓大家都能靈活運用
它。
1 自動對位
經定得不錯的了,所以你也可以不用改動它們而直接使用 cindent。
+-----------+ +----------------+
|cinoptions=| |cinoptions=:0.5s|
+-----------+ +----------------+
switch (x) switch(x)
{ {
case 1: case 1:
a = b; a = b;
default: default:
} }
另外,在字元前可以加上一個特別字元來改變它的意義:'0' 表示跟著的那個字元必需為那行的第一個字,例
如 '0#' 表示如果 '#' 是在行中第一個被輸入的字,那行便會被對齊;'!' 表示隨後跟著的那個字元不會被輸入到
文件裡的,例如 '!^F' 代表 Control-F 不會被加進文件裡。
2 顏色顯示
:syntax on
:set background=dark
:syntax on
:set syntax
:set syntax=php3
<?php
// vim: filetype=php3
?>
3 與編譯器整合
很多時候我們會開啟兩個視窗,一個用來編輯程式碼,一個用來編譯程式並觀看來自編譯器的錯誤訊息,但
這個做法太過不方便了。我們當然可以在 vim 裡用 shell escape 的方法去編譯程式而不用脫離 vim,但這樣做又
不便於回顧編譯時的錯誤訊息。vim 配備兩個極為有用的選項:makeprg 和 errorformat,它們的功用是把程式
編譯的步驟整合到 vim。vim 更會把編譯時的錯誤和警告記下,之後你便可逐個錯誤檢查,vim 能夠跳至發生錯
誤的那一行,方便你立刻作出修改。
:set errorformat=%f:%l:\ %m
如果編譯完成後沒有任何錯誤,就真是可喜可賀!不過通常都沒有那麼完美的,編譯完畢後我們的首要任務
便是檢查錯誤的出處,然後除錯。用於觀察各個錯誤的指令有下列幾個:
‧:cl:列引所有錯誤,包括錯誤代碼、發生錯誤的檔案、行號和錯誤訊息。例如:
‧:cn:跳到下一個錯誤。
‧:cp:跳到上一個錯誤。
‧:cc:跳回最近觀察過的那個錯誤,如果在 cc 後附有數字,則會跳到該錯誤。
‧:cr:跳回第一個錯誤。
‧:cla:跳到最後的錯誤。
4 穿梭於檔案之間
Project 愈大,所涉及的檔案數量愈多,而程式碼之間千絲萬縷的關係就愈複雜,使得工作困難起來,因為經
常於程式檔案間反複查閱變數和函數的定義實在是非常煩嫌的。
以下是檢索用的指令:
‧:tags:有否在檢查程式碼時不停地從一個檔案跳到另一個檔案,最終還是被搞到頭昏的經驗?特別是在看
別人的程式的時候啊!不過如果你是用 Ctrl-] 或 :tag 檢查關鍵字的話,你便可以用 :tags 來翻查 tag stack,
回顧自己曾到過的檔案,多方便!
/usr/include/libio.h
1: 90 # define NULL (__null)
2: 93 # define NULL ((void*)0)
3: 95 # define NULL (0)
/usr/include/dirent.h
1: 20 * POSIX Standard: 5.1.2 Directory Operations <dirent.h>
2: 47 /* This file defines `struct dirent'.
/usr/include/bits/dirent.h
3: 20 # error "Never use <bits/dirent.h> directly; include <dirent.h> instea
d."
4: 23 struct dirent
/usr/include/dirent.h
5: 68 /* These macros extract size information from a `struct dirent *'.
6: 137 dirent' describing the entry, or NULL for EOF or error. The
7: 144 extern struct dirent *readdir __P ( (DIR *__dirp));
似乎第 4 點最像 struct dirent 被 declare 的地方,我們便可以用 '4Ctrl-W i' 或 '4[ Ctrl-I' 來檢視它。
5 除此之外……
‧ruler
‧showmatch
‧shiftwidth=4
‧tabstop=4
‧expandtab
‧nocompatible
ruler 會把浮標的坐標印在右下方,方便自己知道現在身處第幾行。
小結
----
希望今後大家用 vim 寫程式時都能更得心應手,如果你們有甚麼心得的話,不妨 email 我或 post 到 HKLUG 的
newsgroup 上和大家分享!