我有一个名为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>')