開啟多個 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:
- script 語法 (:h script)
- list 和 for (:h Lists)
- function 的注意事項
- 內建函式列表 (:h functions)
- 實用的小範例程式 (foo.vim)、Filter buffer on a search result
如此一來, 不用花多少力氣, 即可讓 vim 的威力增加數倍。