Как отфильтровать вывод cscope в Vim - PullRequest
5 голосов
/ 09 сентября 2011

Я ищу способ grep для вывода cscope запросов из Vim.

У меня не сработало следующее:

:cs f s symbol !grep pattern

Это дало:

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

P.S:
Я знаю метод redir, я ищу более простой способ фильтрации
вывод ex-команды через Unix-команды.

Ответы [ 2 ]

6 голосов
/ 09 сентября 2011

Вы можете использовать :redir для отправки вывода сообщения в регистр или файл.

redir @c
cs f s symbol
redir END

Теперь вы можете поместить регистр c в файл и отфильтровать его.

Я не получаю много выходных данных от cscope (это все в Quickfix), но это будет делать то, что вы описываете.с | (bar):

:!echo 0updateView | cscope -dl | grep global

Но ex-команды интерпретируют bar как разделитель команд (так что вы можете поместить несколько команд в одну строку):

:if &ft != 'help' | silent! cd %:p:h | endif

Я неНе думаю, что вы можете отфильтровать вывод ex-команд, кроме использования redir.Тем не менее, вы можете использовать ответ Бенуа для фильтрации быстрого исправления.

0 голосов
/ 09 сентября 2011

Вот мои функции и макросы для фильтрации списка быстрых исправлений:

Использование:

  • _qf, _qF, _qp и _qP откроет диалоговое окно
  • Вы введете шаблон Vim в это диалоговое окно
  • _qf и _qF будут фильтровать по именам файлов, _qp и _qP по содержимому строки
  • заглавные версии имеют эффект :v (не совпадают строки), обычные версии сохраняют строки, соответствующие вашему шаблону.
  • С помощью :colder и :cnewer вы можете переходить между старыми и новыми списками быстрых исправлений, если результаты вас не удовлетворяют. У меня есть сопоставления для вызова этих команд тоже.

код:

" 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>
...