2010-03-15 47 views
26

當一個文件處理搜索,我已經習慣了:Vim的通過現有的所有緩衝區

/blah 
do some work 
n 
do some work 
n 
do some work 

假設現在我要搜索超過一些模式在Vim中加載的所有緩衝區,做一些工作在他們身上,繼續前進。我爲這個工作流使用了什麼命令?

回答

9

我有以下映射(靈感來自Vimperator),使切換上一個/下一個緩衝區更容易。

nmap <C-P> :bp<CR> 
nmap <C-N> :bn<CR> 

這對'n'非常有效。當你完成你的文件的處理時,只需按CTRL-n再次點擊n,然後在下一個緩衝區中搜索。重做,直到你通過所有的緩衝區。


處理很多文件的另一種方式是參數列表。

它包含在啓動vim時作爲參數傳遞的任何文件(例如:vim someFile.txt someOtherFile.py)。 [括號]內的文件是當前文件。

:args 
[someFile.txt] someOtherFile.py 

:n會帶你到列表中的下一個文件,並且:N會帶你回來。您還可以添加與argslist:argadd,或太創建一個新的args列表與

:n some.py files.py you.py want.py to.py work.py with.py 
or to open all *.py files recursively from some project. 
:n ~/MyProjects/TimeMachine/**/*.py 

與宏的args列表做工精良(見:幫助Q),如果你有你的文件類似的變化。只需在第一個文件上記錄宏,然後按:n移至下一個文件並停止記錄。

qq/searchForSomethingAndDoStuffOrWhatever:nq 

然後通過所有文件(6 @ Q)運行宏,看看,以確保一切順利,並用完成:牆。


它有點取決於你想要做什麼。如果你只是在多個文件中發生了一次完全相同的更改(並且這些更改是唯一已加載的),那麼我還會喜歡:ba(:tabdo sp)命令。這很快,你可以看到發生了什麼。

如果你有一堆打開的緩衝區,你可以加載你想要在其中工作的文件,每個文件在一個窗口中,並對它們進行正則表達式。

CTRL-w v :b someFile 
:sp anotherFile 
... 
:windo :%s/foo/bar/g 

我真的推薦FuzzyFinder,它會讓你的生活在打開文件的時候容易得多。

http://www.vim.org/scripts/script.php?script_id=1984

MMMMMMMM VIM是好的!性感! :)

38

使用bufdo命令。

:bufdo command 

:bufdo command大致等價於迭代每個緩衝區並執行命令。例如,假設你想要做一個查找和貫穿所有的緩衝區替換:

:bufdo! %s/FIND/REPLACE/g 

還是讓我們說,我們要刪除匹配來自所有的緩衝區正規表達式「SQL」文本中的所有行:

:bufdo! g/SQL/del 

或者,也許我們要設置文件編碼成UTF-8上的所有緩存:

:bufdo! set fenc=utf-8 

以上可以推斷爲Windows(:windo),標籤(:tabdo)和參數(:argdo)。查看關於bufdo的幫助以獲取更多信息。

+1

看看這裏http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers – Rod 2012-11-14 17:03:04

+0

這不是一個好的答案。即使它是正確的,它也需要通過評論來查看,然後通過可能提供也可能不提供答案的文檔進行拖網。看到一位資深SO用戶以這種方式回答問題令人失望。 – arman 2014-09-26 13:40:04

+1

我已經添加了一些我希望有用的示例和說明。如果您仍然認爲它缺少某些東西,請告訴我。 – 2014-10-01 18:43:30

1

我不認爲有可能在文件或緩衝區中擴展'n'函數。你可以使用

:grep blah * 

然後做

:cn 

移動到與它嗒嗒下一行。這將在文件之間進行切換,但並不完美。鍵入冒號總是更麻煩,它只會把你帶到線上,而不是單詞。

我通常要做的是打開我想要在標籤中搜索的文件,然後使用'n'和'gt'跳轉到下一個標籤,當我到達文件的末尾,或者列出文件命令行我可以在編輯完成後跳到下一個帶有':wn'的文件。

希望它有幫助!

0

我會使用以下兩條命令打開新的標籤頁所有緩衝區:

:tab sp 
:bufdo sp 

當您完成通過每個文件逐一然後搜索並關閉它的窗口(使用:q:close)。使用CTRL + W_可最大化每個窗口,因爲您正在使用它。當您完成並關閉最後一個窗口時,選項卡頁面將關閉,無論您身在何處,您將決定執行搜索。

21

我們可以使用vimgrep並在argslist中進行搜索。但首先讓我們填充argslist與我們所有的緩衝區:

:bufdo :args ## % 

現在我們可以在我們的argslist

:vimgrep /blah/ ## 

% == the current filepath## == the arglist搜索。

我建議關注這些vimcasts如果您想了解更多:Populate the arglist,你要切換到另一個緩衝區Search multiple files with vimgrep

+2

謝謝!這正是我多年來一直在尋找的東西。 (只是缺少'##'vimgrep參數。)我想我們也可以使用':arga [dd]'將參數添加到列表中。 – 2016-01-28 19:19:59

+0

在vim中'##'是當前的參數列表,'%'是當前的文件名。我們首先用':%argd'清除當前的參數列表,然後使用':bufdo'將緩衝區一次添加到參數列表中。最後,我們使用':vimgrep'和'##'來搜索arglist。 – JPaget 2016-09-01 20:43:44

0

任何時候試試這個。

:b + <any part of file in buffer> + tab 

舉一個例子。我有這在我的緩衝

77 「/var/www/html/TopMenuAlertAlert.vue」 線65
78 「/var/www/html/MainSidebar.vue」 線29
79「/無功/www/html/FullScreenSearch.vue」線26
80 「/var/www/html/Menu.vue」 線93
81 「/var/www/html/layouts/RightSidebar.vue」 線195

正如我想改變到另一個緩衝區,我可能還記得有關文件的一些細節,如'警報'

所以我只是去

:b Alert + tab 

如果給定的文件是不是就是我想要的,我只是不斷的壓片。

Vim將繼續提供接近它的下一個文件。

一旦你得到它。按Enter鍵。