使用 vim script 協助閱讀程式碼

開啟多個 window 顯示各個符合搜尋結果的位置

在讀原始碼時, 我常常想知道某個變數或函式, 在這個檔案裡被用在那些地方, 而且希望在 vim 裡一次開多個 window, 每個 window 顯示一個位置, 方便同時觀看。若能一併尋找其它檔案更好, 不過那會難許多, 第一步先在同一檔案做到這點, 應該就很有幫助。

針對這個需求, 順便研究一下寫 vim function 需要知道的一些基本知識, 寫好的東西見 ShowMatched(pattern) 相關的程式

以編輯 eglibc 的 stdlib/setenv.c 為例, 將游標移到 LOCK 後, 按下 \f, 會開個新 tab, 並呈現如下的畫面:

\f 最多會開兩個 tab, 一個 tab 最多六個 window, 待試用一陣子後再來調整它的行為。可用 :wind q 關掉目前 tab 內所有 window。由於很常用到這功能, 我會設個巨集做這件事:

map qq :q      # 關掉目前 window
map qa :wind q # 關掉目前 tab 的全部 window

vim script

在這裡整理一下寫 vim script 時需要知道的基本常識。

基本上 script 的每一行如同在 ex mode 執行:

g/^$/d  # 等同於 :g/^$/d, 砍掉空行

若需要使用 normal mode 的指令, 要配合使用指令 normal:

normal ggdd  # 砍掉第一行
execute "normal \<c-w>l"  # 切到右邊的 window

若需要讀取指令的輸出結果, 可用 redir 導到 register:

redir @a
:g/printf/p
reidr END
put a  # 將搜到 printf 的顯示結果寫到目前的檔案裡

若在導到 register 時, 不希望同時輸出到螢幕, 得將指令先包在函式裡, 再用 silent call FUNCTION:

silent call MyFunc

知道以上幾件事後, 剩下的就是熟悉語法、找些小範例、查查內建的函式, 就可以延伸原本熟悉的 vim 指令成為 script:

如此一來, 不用花多少力氣, 即可讓 vim 的威力增加數倍。

留言

這個網誌中的熱門文章

virtualbox 使用 USB 裝置

熟悉系統工具好處多多

如何 git merge 更改檔名的檔案