使用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.

posted @ 2018-10-23 00:12  Five100Miles  阅读(882)  评论(0编辑  收藏  举报