2008-11-07 79 views
9

:vimgrep看起來像一個非常有用的東西。在Vim中保存「所有打開的緩衝區列表」的變量?

下面是如何使用它:

:vim[grep][!] /{pattern}/[g][j] {file} ... 

:help說你可以glob的基本要{file}名字,比方說,*.c當前目錄。我可能已經啓動了一個足夠複雜的文件列表,我不想爲{file}手動輸入,除此之外,Vim已經知道這些文件是什麼。

我想什麼做的是使用vimgrep過任何的:

  • :args
  • :files
  • :buffers

什麼變量(S)我會代替{file}使用名稱,分別是vimgrep命令中的任何這些列表?

回答

11

難道你不能捕獲這些命令中的結果到一個寄存器(:h :redir)中,並將它插回:vimgrep調用(帶有:exe)。

喜歡的東西:

:exe "vimgrep/pattern/ " . lh#askvim#Exe(':args') 

注:

  • lh#askvim#Exe只是一個圍繞包裝:redir;沒有什麼複雜的
  • 一些結果可能需要一些處理(見:args,增加了括號)
  • 有時是返回準確的功能,你在找什麼,看到join(argv(), ' '):args情況下
  • 關於:緩衝區,可能是這樣的:

function BuffersList() 
    let all = range(0, bufnr('$')) 
    let res = [] 
    for b in all 
    if buflisted(b) 
     call add(res, bufname(b)) 
    endif 
    endfor 
    return res 
endfunction 
:exe 'vimgrep/pattern/ '.join(BuffersList(),' ') 
+1

BuffersList的工作原理與我想要的完全一樣。謝謝Luc和Zathrus。 – Aaron 2008-11-07 21:05:02

5

你可以這樣做:

:bufdo vimgrep /pattern/ % 

%替換緩衝區名。

+0

這是一個很棒的單線!我不敢相信我幾年前不知道。 – 2010-12-02 01:17:56

3

下面是其中一個答案的稍微精煉的版本。在所有打開的標籤圖案下面的命令搜索並記住在quickfix列表結果:quickfix列表空列表

:cex [] | tabdo vimgrepa /pattern/ % 

cex []集的內容。您需要先撥打它,因爲vimgrepa會累積所有選項卡的搜索結果。此外,您可以用argdobufdowindo替換tabdo

要查看搜索結果執行:

:cope 

這種方法,但是,有侷限性:它只能在已經分配給他們的文件名稱的標籤搜索(%不會在新標籤展開)。

編輯: 您也可以通過快捷鍵命令進入功能在您的~/.vimrc這樣的:

function TS(text) 
    exe "cex [] | tabdo vimgrepa /" . a:text . "/ %" 
endfunction 
command -nargs=1 TS call TS(<q-args>) 
cnoreabbrev ts TS 

隨着上線,你可以打電話給你的功能是這樣的:

:ts from game import 

哪裏話之後ts是一種搜索模式。沒有最後一行,你必須輸入大寫的函數名稱。

2

要使[vim] grep參數列表中的文件列表,您可以使用##(請參閱:help cmdline-special)。

:vimgrep /re/ ## 

我不知道類似的簡寫緩衝區列表的,但你可以做一些事情,如:

:argdelete ## 
:bufdo argadd % 

...然後使用##。或使用:n打開新文件(將添加到arg列表中)而不是:e

相關問題