2011-05-18 68 views
5

我想創建一個'quickfix'列表(見:help quickfix),所有包含「abc」但不包含「xyz」的行的文件。我希望能運行下面的vim ex命令:Vim內部(用管道)grep

:grep -nHr abc * | grep -v xyz 

不幸的是,vim不喜歡「管道」,命令失敗。在vim中做這件事的最好方法是什麼?

+0

你確定你不是指':!...'? (感嘆號) – jwd 2011-05-18 23:46:58

+0

是的。如果您使用「!」,它不會作爲「quickfix」列表返回。 – gdw2 2011-05-18 23:48:43

回答

3

出於某種原因,我不能獨自離開這一個!

如何使用:!grep ... > filename後跟:cf filename,這將打開輸出作爲quickfix列表。

-1

你可以設置grepprg,它定義了Vim用來執行的命令:grep。這可能需要一個管道,但我沒有嘗試過。

當然,這會影響所有:grep小號

+0

它似乎沒有采取管道。或者至少,這對我不起作用:「set grepprg = grp \ -n \ $ * \ | \ cut \ -c \ 1- $ COLUMNS」(也在'|'之前用'\'嘗試過)。它給出「不是編輯器命令:cut -c 1- $ COLUMNS」。也許]它需要正確逃脫,但我還沒有想出如何。 – 2011-07-01 10:32:53

1

你可以做的兩個步驟:

:!(grep -nHr abc * | grep -v xyz >| qf.txt) 
:cfile qf.txt | copen 

,如果你經常改變的模式喲大概可以使用函數來包裝這個 以下是不完美的,但工程:

fu! Mygrep(pat1, pat2) 
    let cmd = "silent !(grep -nHr " . a:pat1 . " * | grep -v " . a:pat2 . " >| qf.txt)" 
    silent exec cmd 
    cfile qf.txt 
    copen 
endfunction 

然後使用它:

:call Mygrep("abc", "xyz") 

它似乎爲我工作,但我也會收到一條錯誤消息「trailin charathers」 (您可能需要輸入以清除屏幕)。

+0

我喜歡'| copen'部分。我不知道你可以這樣做!它沒有出現括號是外部grep命令所必需的。 – gdw2 2011-05-19 16:12:44

0

我只是想出瞭如何逃脫:grepprg使用管道。

在我的情況下,我的:grepprg基於GNU Idutils的lid實用程序。我想要對lid程序的輸出進行排序。這是因爲當我使用模式時,lid發現無序匹配。我想尋找一個像pthread.*lock這樣的模式,並且通過匹配步驟來跟蹤鎖定嵌套,而不是按照mkid生成的ID數據庫的內部順序跟隨文件之間的跳轉,這會交織匹配來自不同的文件。

管道需要雙重逃逸。看起來Vim最終將處理值爲grepprg作爲命令材料。如果你只需要管道一次,它就被解釋爲Vim語法。

所以,我現在已經在我的.vimrc是這樣的:

:set grepprg=lid\ --substring\ --result=grep\ '\\<$*\\>'\ \\\|\ sort 

管道轉義爲\\\|:轉義反斜線和逃脫管生產\|,它經歷了一個更圓處理結束的與|

基於此示例,可以自定義您的grep命令以包含任意Unix管道。


如果您只是想修剪快速結果列表或在結果中進行搜索,那就是一種交互方式。 ,分割窗口之間的導航使用

:cope[Enter] 

本作的物盡其用,瞭解分割窗口,特別是:

:grep後,在包含[快速自身拆分窗口中打開一個緩衝區Ctrl-W Ctrl-W和其他Ctrl-W命令。

在quickfix結果窗口中,您可以通過以普通方式進行搜索來「優化搜索」,就像在任何緩衝區中一樣。無論您導航到哪一行,只需在該行上點擊Enter即可跳轉到其他窗口中的快速列表項目。光標自動轉到該窗口:要返回到快速列表結果以搜索其他內容,請使用Ctrl-W Ctrl-W。

您還可以簡單地刪除:cope緩衝區中不需要的行來修剪快速結果結果。緩衝區默認是不可修改的,所以首先要確保你的光標在該窗口中,然後:

:set modifiable 

然後,你可以這樣做

:g/xyz/d 

刪除包含xyz所有結果。只有剩下的行現在是quickfix列表的一部分。