2012-08-15 25 views
32

Tôi muốn tìm kiếm văn bản trong tất cả các tệp hiện đang mở trong vim và hiển thị tất cả kết quả ở một nơi duy nhất. Có hai vấn đề, tôi đoán:Làm cách nào để tìm kiếm bộ đệm mở trong Vim?

  • tôi không thể vượt qua danh sách các tập tin mở để :grep/:vim, đặc biệt là tên của file mà không phải là trên đĩa;
  • Kết quả của :grep -C 1 text không có vẻ tốt trong cửa sổ quickfix.

Dưới đây là một ví dụ tốt đẹp của việc tìm kiếm tập tin nhiều trong Sublime Văn bản 2: enter image description here

Bất kỳ ý tưởng?

+0

tôi thực sự muốn làm nổi bật các mẫu tìm kiếm như thế trong :-) gvim – cnicutar

+2

http://vi.stackexchange.com/questions/2904/how-to-show- tìm kiếm-kết quả-cho-tất cả-mở-đệm –

Trả lời

30

Hoặc

:bufdo vimgrepadd threading % | copen 

Cửa sổ QuickFix có thể không nhìn tốt cho bạn, nhưng nó là một địa ngục của rất nhiều chức năng hơn so với "bảng kết quả" ST2 nếu chỉ vì bạn có thể giữ nó mở và có thể nhìn thấy trong khi nhảy đến các địa điểm và tương tác với nó nếu nó không có ở đó.

+0

Giải pháp rất tốt. Tôi không biết về lệnh vimgrepadd. Tuy nhiên, lệnh này không hoạt động cho tôi, phải thực hiện: : mẫu bufdo vimgrepadd% theo sau là : copen hoặc: cw, hoặc thậm chí tốt hơn: botright cw –

+0

Bạn nói đúng về '%', Tôi hoàn toàn quên nó. Không cần phải phát hành ': copen' * sau đó *, đặt nó sau khi một đường ống và quickfix được mở tự động. Đã chỉnh sửa câu trả lời. – romainl

+1

Cảm ơn, đó là nhiều hơn hoặc ít hơn những gì tôi muốn.': bufdo grepadd -C 1 luồng%' tạo ra nhiều hay ít những gì tôi muốn. với một số tinh chỉnh cách vim diễn giải kết quả, nó có thể được kết xuất tốt đẹp và dễ thương. Nhân tiện, bạn có thể dễ dàng chia cửa sổ trong ST2 và hiển thị kết quả cùng với các tệp khác, nếu bạn muốn. Vì vậy, – squirrel

5

ackAck.vim xử lý vấn đề này một cách đẹp mắt. Bạn cũng có thể sử dụng :help :vimgrep. Ví dụ:

:bufdo AckAdd -n threading 

sẽ tạo cửa sổ quickfix đẹp cho phép bạn chuyển vị trí con trỏ.

+2

làm thế nào để bạn có được điều này để làm việc mà không có nó mở ra tất cả các bộ đệm nó tìm thấy kết quả trong một chia? – ThePosey

2

tôi đã thực hiện chức năng này trong một thời gian dài trước đây, và tôi đoán nó có thể không phải là sạch nhất các giải pháp, nhưng nó đã được hữu ích cho tôi:

" 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

Giống như câu trả lời của Waz, tôi đã viết lệnh tùy chỉnh cho điều đó, được xuất bản trong số GrepCommands plugin của tôi. Nó cho phép tìm kiếm trên bộ đệm (:BufGrep), cửa sổ hiển thị (:WinGrep), tab và đối số.

(Nhưng giống như tất cả các câu trả lời khác, nó không xử lý bộ đệm giấu tên được nêu ra.)

+0

Tôi nghĩ rằng lý do vimgrep sẽ không tìm kiếm bộ đệm chưa đặt tên là vì nó không có cách nào để hiển thị kết quả khớp trong cửa sổ QuickFix mà không có tên. ví dụ. các kết quả giống như thế này "HillarysEmails.txt | 4 col 6 | Tôi là Nga." Nếu bạn làm: tập tin HillarysEmails sau đó bạn có thể grep bộ đệm chưa lưu. – FocusedWolf

0

Một cải tiến (trên steroid) phiên bản của câu trả lời Waz, với tìm kiếm đệm tốt hơn và xử lý trường hợp đặc biệt, có thể được tìm thấy dưới đây (Những người kiểm duyệt sẽ không cho phép tôi cập nhật câu trả lời của Waz nữa: D). Một phiên bản được tô điểm nhiều hơn với các liên kết cho các phím mũi tên để điều hướng danh sách QuickFix và F3 để đóng cửa sổ QuickFix có thể tìm thấy tại đây: https://pastebin.com/5AfbY8sm (Khi tôi cảm thấy như tìm cách tạo plugin, tôi sẽ cập nhật câu trả lời này. muốn xúc chia sẻ nó cho bây giờ)

" 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 
Các vấn đề liên quan