2016-04-25 18 views
0

我有一个名为Index.txt下列行的文件:如何编写.vimrc函数以匹配给定文件中的文件名并使用vsplit命令打开它?

/Project/A/B/C/D/main.c 
/Project/A/B/C/D/main_backend.c 
/Project/A/B/C/D/main_frontend.c 

我想创建一个命令调用Fsearch使用正则表达式中Index.txt执行搜索,匹配第一次出现和执行:vsplit与它。例如,如果我执行:

:Fsearch main_backend.c 

Vim应该执行:

:vsplit /Project/A/B/C/D/main_backend.c 

,如果我执行:

:Fsearch main*.c 

Vim应该执行:

:vsplit /Project/A/B/C/D/main.c 

这是我到目前为止所尝试的,但我很确定它coul d改进:

function! CopyMatches(reg) 
let l:file = grep -m 1 a:reg ~/Index.txt 
echom l:file 
if len(l:file) > 0 
    exec ':vsp ' . l:file 
else 
echom 'File not found: ' . l:file 
end 
endfunction 
command! -nargs=* Fsearch call CopyMatches('<args>') 

有什么建议吗?

回答

1

你可以试试这个:

function! CopyMatches(reg) 
    execute "silent! grep!" a:reg " ~/Index.txt" 
    redraw! 
    let l:file = getqflist() 
    if len(l:file) > 0 
     let l:path_head = fnamemodify("~/workspace", ":p") 
     for l:item in l:file 
      let l:current_file = l:path_head . "/" . l:item["text"] 
      if match(l:current_file, getcwd()) != -1 
       execute 'vsplit' fnamemodify(l:current_file, ":~:.") 
       return 
      endif 
     endfor 
     echom "File not found:" a:reg 
    else 
     echom "File not found:" a:reg 
    endif 
endfunction 

command! -nargs=* Fsearch call CopyMatches('<args>') 

说明:

  • :grep内置命令是Vim使用的包装执行外部grep(见:help grep了解更多信息)。
  • :grep命令的:grep!形式不会自动跳转到第一个匹配(即:grep!不会打开Index.txt)。
  • :silent!命令用于取消默认的全屏grep输出。
  • Vim使用quickfix list:grep这样你就可以从getqflist()功能(见:help getqflist()了解详细信息)
+0

由于它的工作原理GR8得到所有出现。如果我想更改行,请使用先前的解决方案执行“silent!grep!” a:reg“〜/ Index.txt”执行“silent!grep!” a:reg“〜/ cscope.files”| “grep'cut -d/-f 5- <<<”$ {PWD}“'”。这样我总能得到相对的结果。 PLZ任何建议如何做到这一点? – ypp

+0

'system(“pwd | cut -d/-f 5 - ”。expand(“%”))'给出想要的搜索字符串我想用,所以我试着'执行“silent!grep!” a:reg“〜/ cscope.files”| EXE“silent!grep”系统(“pwd | cut -d/-f 5 - ”。expand(“%”))'但是在执行Ctrl + c之后它仍然继续运行给出错误'E486:pattern not found:dev ' – ypp

+0

说现在我的$ pwd是/ home/user/workspace/Project_1/A/B/C/ ':Fsearch main * .c' 说我得到以下结果(我在grep中没有使用-m1) /家庭/用户/工作区/ Project_1/A/B/C/D/main_frontend.c /home/user/workspace/Project_1/A/main_common.c 但我想':Fsearch main * .c'应该只读取结果,即wrt $ pwd /home/user/workspace/Project_1/A/B/C/main_backend。c /home/user/workspace/Project_1/A/B/C/D/main_frontend.c – ypp

相关问题