我有一个名为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>')
非常感谢任何帮助。
答案 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>')