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

时间:2016-04-27 00:25:23

标签: vim grep

我有一个名为index.txt的大文件,它包含列出的所有文件的所有绝对路径,例如

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

需要编写vimrc函数来搜索index.txt的每一行中的最后一个单词,其中分隔符为/(即仅搜索basename)而不匹配foldername,它也应该接受*作为搜索中参数的一部分。

说如果我传递参数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>')

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

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>')