我正在寻找一种方法来从Vim中查询cscope
查询的输出。
以下内容对我不起作用:
:cs f s symbol !grep pattern
它给了:
E259: no matches found for cscope query s symbol !grep pattern ...
P.S:
我知道redir
方法,我正在寻找一种更简单的方法来过滤
通过Unix命令输出ex命令。
答案 0 :(得分:6)
您可以使用:redir
将消息输出发送到寄存器或文件。
redir @c
cs f s symbol
redir END
现在您可以将c
寄存器放入文件中并对其进行过滤。
我没有从cscope获得太多输出(它在quickfix中都是如此),但这将完成您所描述的内容。
通常,您可以使用:help :!cmd
(条形码)过滤shell命令(请参阅|
):
:!echo 0updateView | cscope -dl | grep global
但ex命令将bar解释为命令分隔符(因此您可以在一行上放置多个命令):
:if &ft != 'help' | silent! cd %:p:h | endif
除了使用redir
之外,我认为您不能过滤ex命令的输出。但是,您可以使用Benoit的答案来过滤quickfix。
答案 1 :(得分:0)
以下是我的函数和宏来过滤quickfix列表:
用法:
_qf
,_qF
,_qp
和_qP
会打开一个对话框提示_qf
和_qF
会过滤文件名,_qp
和_qP
关于内容:v
效果(保持行不匹配),普通版本保持与您的模式匹配的行。:colder
和:cnewer
,如果结果不符合您的要求,您可以跳过较旧和较新的quickfix列表。我也有映射来调用这些命令。代码:
" Filter Quickfix list
function! FilterQFList(type, action, pattern)
let s:curList = getqflist()
let s:newList = []
for item in s:curList
if a:type == 'f' " filter on file names
let s:cmpPat = bufname(item.bufnr)
elseif a:type == 'p' " filter on line content (pattern)
let s:cmpPat = item.text . item.pattern
endif
if item.valid
if a:action == '-'
" Delete matching lines
if s:cmpPat !~ a:pattern
let s:newList += [item]
endif
elseif a:action == '+'
" Keep matching lines
if s:cmpPat =~ a:pattern
let s:newList += [item]
endif
endif
endif
endfor
" Assing as new quickfix list
call setqflist(s:newList)
endfunction
nnoremap _qF :call FilterQFList('f', '-', inputdialog('Delete from quickfix files matching: ', ''))<CR>
nnoremap _qf :call FilterQFList('f', '+', inputdialog('Keep only quickfix files matching: ', ''))<CR>
nnoremap _qP :call FilterQFList('p', '-', inputdialog('Delete from quickfix lines matching: ', ''))<CR>
nnoremap _qp :call FilterQFList('p', '+', inputdialog('Keep only quickfix lines matching: ', ''))<CR>