2017-03-23 195 views
1

我有一個針對我的FPGA項目的複合項目層次結構。我寫了一個檢查「Vivado/ISE」項目文件的傳遞者,並返回一個包含項目用戶所有源文件列表的文件(然後我在此列表上運行ctags)。VIM:grep搜索文本文件中列出的所有文件

我希望能夠從vim 7.4搜索這個文件列表,而無需通過FPGA庫進行整個遞歸搜索。

cat ./files.txt | xargs grep -Hn my_function 

凡./files.txt包含的文件列表我就搜索了:我可以從Linux命令行使用類似的做到這一點。但是我想能夠使用vim的內部grep函數。我也希望能夠從Windows和Linux上運行它。

是否有一種簡單的方法將文件列表(包含在文件中)傳遞給vim的grep ex函數?

+0

當你的意思是'Windows和Linux',你的意思是'bash' for Windows? – Inian

+0

@Inian:我在Win10和多種Linux下開發。我在Windows下使用Cygwin,但理想情況下我想要一些根本不使用bash的東西。 –

回答

2

你應該使用一個插件,如CtrlSF。但是,如果你堅持要單獨用Vim做到這一點,你可以做這樣的事情:

function! Grep(what, where) 
    exec join(extend(['vimgrep', a:what], 
     \ map(filter(readfile(a:where), 'v:val !=# "" && filereadable(v:val)'), 
     \ 'fnameescape(v:val)'))) 
    copen 
endfunction 

command! -nargs=+ Grep call Grep(<f-args>) 

然後你只需要調用:Grep /pattern/ filelist,而不是:vimgrep /pattern/ ...

+0

感謝佐藤,劇本效果很好,非常有幫助! –

1

如果您在打開的所有文件時,Vim-例如用 vim `<files.txt` - 然後你可以用(例如)搜索所有的人都

:bufdo g/my_function/ 

如果:set nu你會得到行號按 ​​

+0

我似乎無法得到「vim <./ files.txt」爲我工作也許文件列表是長(125),路徑長達120個字符深。我收到的錯誤信息是「Vim:讀取輸入錯誤,退出...」。我真的很希望能夠在已經運行的vim版本上執行搜索。 –

+0

對不起。編輯刪除了我輸入的引號,圍繞 Mischa

+0

Vim \' Mischa

2

第一步,填充列表中的所有文件的參數列表:

" in UNIX-like environments 
:args `cat files.txt` 

" in Windows 
:args `type files.txt` 

第二步,在參數列表中搜索pattern

:vim pattern ## 
+0

我真的很喜歡你的答案!但我喜歡Satos回答更多,因爲它跑得快,不需要貓。非常感謝你。很有幫助! –

+1

那麼,如果這有什麼困擾你,你可以在窗口上使用'type'而不是'cat'。 – romainl