寫程式的時候常常遇到一種情況,假設你是團隊的新人,需要常常參照別人的程式,看看團隊的 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 a
  • mA: 在這個地方設置 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 小技巧

每次在使用 / 搜尋一定會案 nN 到處跳轉,尋找目標,常常找完了之後,忘記我原本的地方在哪了,此時就能先用 mark 記住後在開始用 / 查找。 由於常使用這種操作,所以直接這樣:

nnoremap / ms/

/搜尋完後,要跳回原本的地方就 's 就好

結語

人類總是會在大量的資料中迷失,並且花上很多時間查找和記憶,標記(或是書籤)就是其中一種解決方案,而且應用不只在書上,到處都可以看到類似的應用,像是檔案夾的標籤、英文書在最後會有的索引,然而在寫程式上也不例外。不管是在寫 code 上還是其他應用,好好的應用這些工具將能事半功倍。

Reference

  1. https://medium.com/usevim/vim-101-marks-caad7106b241
  2. https://medium.com/usevim/vim-101-practicing-marks-fc5778d8aaea
  3. https://vim.fandom.com/wiki/Using_marks