2012-08-15 11 views
32

Ich möchte in allen derzeit in vim geöffneten Dateien nach Text suchen und alle Ergebnisse an einem einzigen Ort anzeigen. Es gibt zwei Probleme, ich denke:Wie suche ich die offenen Puffer in Vim?

  • Ich kann nicht die Liste der geöffneten Dateien :grep/:vim passieren, vor allem die Namen der Dateien, die nicht auf der Festplatte sind;
  • Das Ergebnis von :grep -C 1 text sieht im Quickfix-Fenster nicht gut aus.

Hier ist ein schönes Beispiel für mehrere Dateisuche in Sublime Text 2: enter image description here

Irgendwelche Ideen?

+0

ich würde wirklich Suchmuster hervorheben, dass wie in gvim :-) – cnicutar

+2

http://vi.stackexchange.com/questions/2904/how-to-show- search-results-for-all-open-Puffer –

Antwort

30

Oder

:bufdo vimgrepadd threading % | copen 

Das quickfix Fenster nicht gut für Sie aussieht, aber es ist eine verdammt viel mehr funktional als ST2 des „Ergebnisfenster“, wenn nur, weil Sie es offen und sichtbar beim Springen an Orten halten und interagieren mit ihm, wenn es nicht da ist.

+0

Sehr gute Lösung. Ich wusste nichts über den Befehl vimgrepadd. Allerdings funktioniert der Befehl nicht für mich so wie er war: : bufdo vimgrepadd pattern% gefolgt von : copen oder: cw, oder noch besser: botright cw –

+0

Sie haben Recht mit dem '%', Ich habe es total vergessen. Keine Notwendigkeit, ': copen' * danach * auszugeben, nach einer Pipe zu setzen und der Quickfix wird automatisch geöffnet. Antwort bearbeitet. – romainl

+1

Danke, es ist mehr oder weniger was ich wollte.': bufdo grepadd -C 1 Threading%' produziert mehr oder weniger was ich wollte. Mit etwas Optimierung, wie vim die Ergebnisse interpretiert, kann es wahrscheinlich nett und süß gemacht werden. Übrigens können Sie das Fenster in ST2 aufteilen und die Ergebnisse zusammen mit anderen Dateien anzeigen, wenn Sie möchten. So-- – squirrel

5

ack und Ack.vim behandeln Sie dieses Problem schön. Sie können auch :help :vimgrep verwenden. Zum Beispiel:

:bufdo AckAdd -n threading 

wird ein schönes Quickfix-Fenster erstellen, mit dem Sie an die Cursorposition springen können.

+2

Wie funktioniert das, ohne dass es alle Puffer öffnet, die das Ergebnis in einem Split finden? – ThePosey

2

ich diese Funktion gemacht vor langer Zeit, und ich vermute, es ist wahrscheinlich nicht das sauberste von Lösungen, aber es hat sich für mich als nützlich erwiesen:

" Looks for a pattern in the open buffers. 
" If list == 'c' then put results in the quickfix list. 
" If list == 'l' then put results in the location list. 
function! GrepBuffers(pattern, list) 
    let str = '' 

    if (a:list == 'l') 
     let str = 'l' 
    endif 

    let str = str . 'vimgrep /' . a:pattern . '/' 

    for i in range(1, bufnr('$')) 
     let str = str . ' ' . fnameescape(bufname(i)) 
    endfor 

    execute str 
    execute a:list . 'w' 
endfunction 

" :GrepBuffers('pattern') puts results into the quickfix list 
command! -nargs=1 GrepBuffers call GrepBuffers(<args>, 'c') 

" :GrepBuffersL('pattern') puts results into the location list 
command! -nargs=1 GrepBuffersL call GrepBuffers(<args>, 'l') 
2

Wie die Antwort von Waz, habe ich geschrieben benutzerdefinierte Befehle dafür, veröffentlicht in meinem GrepCommands plugin. Es ermöglicht die Suche über Puffer (:BufGrep), sichtbare Fenster (:WinGrep), Registerkarten und Argumente.

(Aber wie alle anderen Antworten, ist es nicht handhaben unbenannte Puffer noch.)

+0

Ich denke, der Grund, vimgrep wird nicht unbenannte Puffer suchen liegt daran, dass es keine Möglichkeit gibt, die Übereinstimmung im QuickFix-Fenster ohne Namen anzuzeigen. z.B. Übereinstimmungen sehen so aus "HillarysEmails.txt | 4 col 6 | Ich bin Russland.". Wenn Sie: Datei HillarysEmails dann können Sie den ungesicherten Puffer grep. – FocusedWolf

0

An (auf Steroiden) Version von Waz Antwort verbessert, mit einem besseren Puffer Suche und Sonderfall Handhabung, finden Sie unten (Die Moderatoren ließen mich Waz 'Antwort nicht mehr aktualisieren: D). Eine ausgefeiltere Version mit Binds für Pfeiltasten zum Navigieren in der QuickFix-Liste und F3 zum Schließen des QuickFix-Fensters finden Sie hier: https://pastebin.com/5AfbY8sm (Wenn ich herausfinden möchte, wie man ein Plugin erstellt, werde ich diese Antwort aktualisieren beschleunigen wollte es jetzt) ​​teilen

" Looks for a pattern in the buffers. 
" Usage :GrepBuffers [pattern] [matchCase] [matchWholeWord] [prefix] 
" If pattern is not specified then usage instructions will get printed. 
" If matchCase = '1' then exclude matches that do not have the same case. If matchCase = '0' then ignore case. 
" If prefix == 'c' then put results in the QuickFix list. If prefix == 'l' then put results in the location list for the current window. 
function! s:GrepBuffers(...) 
    if a:0 > 4 
     throw "Too many arguments" 
    endif 

    if a:0 >= 1 
     let l:pattern = a:1 
    else 
     echo 'Usage :GrepBuffers [pattern] [matchCase] [matchWholeWord] [prefix]' 
     return 
    endif 

    let l:matchCase = 0 
    if a:0 >= 2 
     if a:2 !~ '^\d\+$' || a:2 > 1 || a:2 < 0 
      throw "ArgumentException: matchCase value '" . a:2 . "' is not in the bounds [0,1]." 
     endif 
     let l:matchCase = a:2 
    endif 

    let l:matchWholeWord = 0 
    if a:0 >= 3 
     if a:3 !~ '^\d\+$' || a:3 > 1 || a:3 < 0 
      throw "ArgumentException: matchWholeWord value '" . a:3 . "' is not in the bounds [0,1]." 
     endif 
     let l:matchWholeWord = a:3 
    endif 

    let l:prefix = 'c' 
    if a:0 >= 4 
     if a:4 != 'c' && a:4 != 'l' 
      throw "ArgumentException: prefix value '" . a:4 . "' is not 'c' or 'l'." 
     endif 
     let l:prefix = a:4 
    endif 

    let ignorecase = &ignorecase 
    let &ignorecase = l:matchCase == 0 
    try 
     if l:prefix == 'c' 
      let l:vimgrep = 'vimgrep' 
     elseif l:prefix == 'l' 
      let l:vimgrep = 'lvimgrep' 
     endif 

     if l:matchWholeWord 
      let l:pattern = '\<' . l:pattern . '\>' 
     endif 

     let str = 'silent ' . l:vimgrep . ' /' . l:pattern . '/' 

     for buf in getbufinfo() 
      if buflisted(buf.bufnr) " Skips unlisted buffers because they are not used for normal editing 
       if !bufexists(buf.bufnr) 
        throw 'Buffer does not exist: "' . buf.bufnr . '"' 
       elseif empty(bufname(buf.bufnr)) && getbufvar(buf.bufnr, '&buftype') != 'quickfix' 
        if len(getbufline(buf.bufnr, '2')) != 0 || strlen(getbufline(buf.bufnr, '1')[0]) != 0 
         echohl warningmsg | echomsg 'Skipping unnamed buffer: [' . buf.bufnr . ']' | echohl normal 
        endif 
       else 
        let str = str . ' ' . fnameescape(bufname(buf.bufnr)) 
       endif 
      endif 
     endfor 

     try 
      execute str 
     catch /^Vim\%((\a\+)\)\=:E\%(683\|480\):/ "E683: File name missing or invalid pattern --- E480: No match: 
      " How do you want to handle this exception? 
      echoerr v:exception 
      return 
     endtry 

     execute l:prefix . 'window' 
    "catch /.*/ 
    finally 
     let &ignorecase = ignorecase 
    endtry 
endfunction 
Verwandte Themen