先附上完整 script:
" Open .h if it's a cpp file, and vice versa. function! OpenComplementFile() let f = expand('%') " (1) let suffix = matchstr(f, '\.\a\+$') let pattern = suffix . "$" if suffix == '.h' let suffixes = ['.cpp', '.cc', '.mm', '.m', '.h'] for suf in suffixes let target = substitute(f, pattern, suf, '') " (2) if filereadable(target) break endif endfor elseif suffix == '.cpp' || suffix == '.cc' || suffix == '.m' || suffix == '.mm' let target = substitute(f, pattern, '.h', '') if !filereadable(target) let tmp = target let target = substitute(tmp, '\v(.+)\..+', 'public/\1.h', '') " (3) if !filereadable(target) let target = substitute(tmp, '\v(.+)/(.+)\.(.+)', '\1/public/\2.h', '') endif endif else let target = '' endif if filereadable(target) exec 'vsplit ' target else echo "Complement file not found" endif endfunction nnoremap <silent> <F4> :call OpenComplementFile()<CR>
在 vimrc 裡放入上述程式, 然後在 normal mode 裡按 F4 會有如下的反應:
- 若是在 X.h 裡面, 會試著在垂直分開的視窗裡開啟 X.cpp, 若沒有 X.cpp, 則會依序改試 X.cc, X.mm, X.m。
- 若是在 X.cpp (或 .cc, .mm, .m) 裡, 會先試開 X.h, 若沒有 X.h, 再試 public/X.h。有需要的話, 可以配合自己的習慣往更深的目錄找。
1.
- 詳見 :h expand。
- % 表示目前的檔名。
- 簡單的檔名轉換可以用 expand 就做完, 比方說如下的例子:
"open A_test.X if current file name is A.X "open A.X if current file name is A_test.X function OpenCorrespondingFile() let d = split(expand("%"), '_test') if len(d) == 1 let name = expand("%:r") . "_test." . expand("%:e") else let name = d[0] . d[1] endif exec 'vsplit ' name endfunction
2.
- 寫上述 script 的時候, 花最多時間查詢如何使用函式 substitue()。參考 vim 內部的說明 :h substitute() 即可。
- 注意要加 () 表示查詢函式的文件, 而不是查 Ex command 的 :substitute。
3.
- :h magic 說明 vim 對待特殊字元的方法。在 pattern 前面加上 "\v" 會和其它 script 的用法一致, 比較方便。
要切換 source/head file, 這個 plugin 也工作的不錯, 也有考慮到擴展到別的語言的問題
回覆刪除http://www.vim.org/scripts/script.php?script_id=31
謝啦, 待有更深的需求時來研究看看
回覆刪除