寫程式的時候常常遇到一種情況,假設你是團隊的新人,需要常常參照別人的程式,看看團隊的 coding style 等等,可能需要參照 A file 的第 10 行,B file 第 8 行,C file 第 999 行。
另一種情境則是在寫測試的時候會和實作交互參照,而測試程式往往和實作程式會拆開不同的檔案,所以就必須要一直跳轉。
使用 split 的方式縱然是一個不錯的方式,但是如果要參照的點大於三個,就將螢幕切成三份,那工程師就相當痛苦了,不是每個人都用這種電腦螢幕啊。這種 split 的方式還有另一個缺點:如果手殘將檔案關掉,就得重找。
Mark
vim 的 mark 取名或許源自於 bookmark (書籤) 這個字,書籤的用意在於能快速找回你上次看的那一頁,而 vim mark 的用意也是如此:能快速找回你剛剛在看 code 的地方。
vim 的 mark 分為三種:
- Local mark
a-z
: 每一個 file 裡皆有自己的 local mark,也就是說檔案 A 可以有 mark a, 檔案 B 裡也可以有自己的 mark a - Global mark
A-Z
: 此種 mark 是全域的,也就是說在檔案 A 裡所看到的 mark A 和 B 檔案 B 裡的 mark A 是一樣的 - Special mark:其他神奇的 mark,不在此文章討論範圍
mark 的基本使用:
ma
: 在這個地方設置 mark amA
: 在這個地方設置 mark A'a
: 跳到 mark a 的這行 (此行的第一個非空白字元)`a
: 精準的跳到你當初設置 mark a 的位置 (第幾行第幾列):marks
: 列出來所有 mark,有時候 mark 設置太多會忘
更多詳細操作請參照 Reference 3
回到正題
還記得一開始的情境敘述嗎?
雖然你已經知道要在 A file 第 10 行 mA
, 在 B file 第 8 行 mB
,C file 第 999 行 mC
。
實際上在寫 code 時我會這樣做:
- 我會先將我需要參照的地方找出並且 mark,以剛剛的例子來說就是在 A file 第 10 行
mA
在 B file 第 8 行mB
,C file 第 999 行mC
- 使用
:vsplit
將螢幕切成兩邊,左邊寫 code,右邊當參照區域 - 需要參照 B 這個位置時,移動到參照區域 ,
'B
再移動回寫 code 區域繼續寫
那 local mark 什麼時候用? 當一個檔案大於 1000 行,寫的程式在 1001 行,但你需要參照的程式在第一行,也就是都在同一個 file 跳轉的時候可以使用。
search 小技巧
每次在使用 /
搜尋一定會案 n
或 N
到處跳轉,尋找目標,常常找完了之後,忘記我原本的地方在哪了,此時就能先用 mark 記住後在開始用 /
查找。
由於常使用這種操作,所以直接這樣:
nnoremap / ms/
在/
搜尋完後,要跳回原本的地方就 's
就好
結語
人類總是會在大量的資料中迷失,並且花上很多時間查找和記憶,標記(或是書籤)就是其中一種解決方案,而且應用不只在書上,到處都可以看到類似的應用,像是檔案夾的標籤、英文書在最後會有的索引,然而在寫程式上也不例外。不管是在寫 code 上還是其他應用,好好的應用這些工具將能事半功倍。