2011-09-08 11 views
5

Estoy buscando una manera de grep la salida de cscope consultas de Vim.Cómo filtrar la salida de cscope dentro de Vim

El siguiente no funcionó para mí:

:cs f s symbol !grep pattern 

Se dio:

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

PS:
sé el método redir, Busco una manera más sencilla para filtrar
salida de ex comando (s) a través de comandos Unix.

Respuesta

6

Puede usar :redir para enviar un mensaje de salida a un registro o archivo.

redir @c 
cs f s symbol 
redir END 

Ahora usted puede poner el registro c en un archivo y filtrarlo.

No obtengo mucha salida de cscope (todo está en la corrección), pero eso hará lo que está describiendo.


En general, puede filtrar los comandos de shell (véase :help :!cmd) con | (bar):

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

Pero ex comandos interpretan de barras como un separador de comandos (lo que puede poner varios comandos en una línea):

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

creo que no se puede filtrar la salida del ex comandos aparte de usar redir. Sin embargo, puede usar la respuesta de Benoit para filtrar la corrección rápida.

0

Éstos son mis funciones y macros para filtrar la lista quickfix:

Uso:

  • _qf, _qF, _qp y _qP se abra un símbolo del diálogo
  • Usted escriba un patrón de Vim en ese cuadro de diálogo
  • _qf y _qF se filtrará en los nombres de archivo, _qp a nd _qP en el contenido de la línea
  • las versiones en mayúscula tienen un efecto :v (las líneas no coinciden), las versiones normales mantienen las líneas que coinciden con su patrón.
  • Con :colder y :cnewer puede saltar a través de las listas de revisiones rápidas anteriores y posteriores si los resultados no le satisfacen. Tengo asignaciones para llamar esos comandos, también.

El código:

" 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> 
+0

no funcionó para mí. También he ': establecido cscopequickfix = s-, c-, d-, i-, t-, e-, a-'. De hecho, puedo llamar a esta función con ': call FilterQFList', pero la asignación de teclas simplemente no funciona.Quiero decir que este mapeo puede funcionar en modo normal antes de buscar algo con cscope. También construyo mi vim con la función 'enorme'. – VicX

Cuestiones relacionadas