vimrc 函数在文件中使用文字“*”搜索文件名,该文件包含具有绝对路径的所有项目文件名的列表



我有一个名为index的大文件.txt它列出了所有文件的所有绝对路径,上面写着,

common/mac_get.c
common/addr/addr_main_set_clear_config.c
common/addr/mac/mac_load_done.c

需要编写vimrc函数来仅搜索索引每行中的最后一个单词.txt分隔符为/(即仅搜索basename)并且与文件夹名称不匹配,它也应该接受*作为搜索中参数的一部分。

说如果我传递参数mac*.c那么它应该搜索以mac开头并以.c结尾的文件,然后返回结果:

common/mac_get.c
common/addr/mac/mac_load_done.c

说如果我传递参数mac*done.c那么它应该搜索以 mac 开头并以 done.c 结尾的文件,然后返回结果为,

common/addr/mac/mac_load_done.c  

比如说如果我传递参数*main*.c*main*set*.c那么它应该返回结果为,

common/addr/addr_main_set_clear_config.c  

这是我到目前为止尝试过的:

function! searchFname(fname)
   execute "silent! grep!" a:fname "~/index.txt"
endfunction
command! -nargs=* Fname call SearchFname('<args>')

任何帮助将不胜感激。

grep使用*作为与前面元素匹配零次或多次的量词,但您需要将其用作匹配任何字符的通配符。

即使grep不使用通配符,您也可以构建等效的正则表达式,例如:

  • *相当于.*
  • ?相当于.

要仅匹配文件名(不包括路径),必须将.替换为[^/],如下所示:

function! SearchFname(fname)
    execute 'silent! grep! "^(.*/)?' . substitute(substitute(substitute(a:fname,'*','[^/]*','g'),'.','\.','g'),'?','[^/]','g') . '$"' "~/index.txt"
endfunction
command! -nargs=* Fname call SearchFname('<args>')

grep的输出仍然会显示在Vim启动的终端上。要摆脱它,你可以改用 :vimgrep 命令,但你需要使用一个模式,就像在 Vim 搜索中一样(有关详细信息,请参阅:help :vimgrep):

function! SearchFname(fname)
    execute 'silent! vimgrep /^(.*/)?' . substitute(substitute(substitute(a:fname,'*','[^/]*','g'),'.','.','g'),'?','[^/]','g') . "$/j" "~/index.txt"
endfunction
command! -nargs=* Fname call SearchFname('<args>')

最新更新