先附上完整 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 的用法一致, 比較方便。