使用vim内建函数findfile()笔记
findfile()类似find命令, 可以快速查找文件. 它接受三个参数: (被搜索的)文件名, 搜索路径(与搜索方式)与匹配次数(-1为不限次数). 返回值是一个包含给定匹配次数的文件列表.
例如平时工作时需要在头文件与源文件之间快速切换, 而两者又不在统一目录, 那么可以使用以下代码:
1 nnoremap <leader>% :call FindHeader()<CR> 2 function! FindHeader() 3 let targetfile = "" 4 if expand("%:e") == "h" 5 let targetfile = expand("%:t:r").".cpp" 6 else 7 let targetfile = expand("%:t:r").".h" 8 endif 9 for onefile in findfile(targetfile, "**", -1) 10 silent exe ":e ".onefile 11 endfor 12 endfunction
使用findfile()时需要注意它的搜索方式: downward / upward / combile. 关于搜索方式建议使用:h file-searching查看详细说明. 我的理解如下:
downward search时通配符*与**起效(分别匹配文件basename与dirname). 类似shell中通配符无需加.(*即.*), 此外可以使用**n指定搜索目录层数(最大n层目录).
upward search时使用;指定向上搜索的截止目录, 如果有多个截止目录则用多个;隔开, 没有截止目录则使用;(没有;则不使用upward search).
当搜索路径中既包含通配符又包含;时使用combine search模式, 会同时向上向下搜索(此时搜索目录最为复杂).
举例当前vim工作目录为~且包含123与456两个子目录:
findfile(file, "*", -1)仅在~下搜索文件file.
findfile(file, "**", -1)在~及其子目录下搜索文件file.
findfile(file, ";", -1)从~开始向上搜索至根目录, 查找文件file.
findfile(file, "/home;", -1)从~开始向上搜索至/home目录, 查找文件file.