如何在Vim中过滤cscope输出

时间:2011-09-08 21:57:05

标签: vim cscope

我正在寻找一种方法来从Vim中查询cscope查询的输出。

以下内容对我不起作用:

:cs f s symbol !grep pattern

它给了:

E259: no matches found for cscope query s symbol !grep pattern ...

P.S:
我知道redir方法,我正在寻找一种更简单的方法来过滤
通过Unix命令输出ex命令。

2 个答案:

答案 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会打开一个对话框提示
  • 您将在该对话框提示中键入Vim模式
  • _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>