Cách hiển thị kết quả tìm kiếm cho tất cả các bộ đệm mở


17

Một điều tôi thường làm (nhưng dựa vào dòng lệnh để làm) là tìm kiếm / grepping trong nhiều tệp.

Có cách nào để hiển thị kết quả tìm kiếm cho tất cả các bộ đệm mở không?

Lý tưởng nhất là tôi muốn có một bộ đệm phân tách mới chứa vị trí kết quả và đoạn trích giống như grepvậy. Ví dụ /statistics:):

models/statistics.php: /*! \file   statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();

Là một phần thưởng, tôi muốn có thể tìm kiếm cụm từ dưới con trỏ, khá giống như gdvậy.


Câu trả lời:


15

Bạn có thể sử dụng :vimgrep /pattern/ {files}để điền vào danh sách quickfix với các mẫu phù hợp. Vấn đề là :vimgreptùy chọn tập tin không trực tiếp cho phép bộ đệm. Bạn có thể dùng:

%   Is replaced with the current file name.       *:_%* *c_%*
#   Is replaced with the alternate file name.     *:_#* *c_#*
#n  (where n is a number) is replaced with        *:_#0* *:_#n*
    the file name of buffer n.  "#0" is the same as "#".     *c_#n*
##  Is replaced with all names in the argument list   *:_##* *c_##*
    concatenated, separated by spaces.  Each space in a name
    is preceded with a backslash.
#<n (where n is a number > 0) is replaced with old    *:_#<* *c_#<*
    file name n.  See |:oldfiles| or |v:oldfiles| to get the
    number.                         *E809*
    {only when compiled with the |+eval| and |+viminfo| features}

Một tùy chọn khác là viết một tập lệnh tạo danh sách tệp từ đó :buffers. Mỗi bài đăng SO này với một chút thời gian chúng tôi nhận được:

function! BuffersList()
  let all = range(0, bufnr('$'))
  let res = []
  for b in all
    if buflisted(b)
      call add(res, bufname(b))
    endif
  endfor
  return res
endfunction

function! GrepBuffers (expression)
  exec 'vimgrep/'.a:expression.'/ '.join(BuffersList())
endfunction

command! -nargs=+ GrepBufs call GrepBuffers(<q-args>)

Bây giờ bạn có thể gọi :GrepBufs <expression>và nhận :vimgrepđầu ra tiêu chuẩn nhưng sử dụng bộ đệm thay thế.

Cập nhật Nếu bạn muốn gọi GrepBuffersbằng cách sử dụng giá trị dưới con trỏ, hãy thêm ánh xạ mới này.

nnoremap <leader>z :call GrepBuffers("<C-R><C-W>")<CR>

Khi bạn ở loại chế độ bình thường <leader>zvà bạn sẽ :vimgreptừ con trỏ trên bộ đệm đang mở.


2
Ở dạng dòng đơn : command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' '). Cách sử dụng::Bufgrep/foo/
Peter Rincker

8

Tìm kiếm trong bộ đệm chỉ mở là tốt, nhưng có thể đến lúc bạn muốn tìm kiếm trên toàn bộ dự án. Nó có thể nhanh hơn và dễ dàng hơn bạn nghĩ!

Tìm kiếm trên một dự án

  • greplà công cụ tìm kiếm tiêu chuẩn Unix. Đáng nói do tính phổ biến của nó. Đã được tích hợp vào Vim thông qua :greplệnh. ví dụ :grep -r 'foo'. Xem :h :grep.
  • Ack nhanh hơn grep thông thường vì nó bỏ qua các thư mục VCS, tệp nhị phân và có thể tìm kiếm loại tệp cụ thể như --perl. Để tích hợp Vim, xem Ack.vim
  • Ag the Silver Surfer là một công cụ tìm kiếm mã tương tự như ack, nhưng nhanh hơn. Plugin Vim: Ag.vim
  • git greptìm kiếm một kho lưu trữ rất nhanh. Fugitive.vim cung cấp :Ggrep.
  • Ripgrep thậm chí còn nhanh hơn Ag và git grep. Có thể được sử dụng với :greplà tốt.

Tôi đề nghị cả ripgrep, Ag và git grepvì tất cả chúng đều siêu nhanh. Tôi đã tìm kiếm hơn 4700+ trong chưa đầy 1 giây. Rất khó để đánh bại ripgrep.

Để kiểm tra một trong những lựa chọn thay thế này mà không cần plugin hoặc đơn giản là bạn không muốn plugin, bạn có thể đặt 'grepprg'tùy chọn của mình cho phù hợp. ví dụ set grepprg=ag\ --vimgrephay set grepprg=rg\ --vimgrep. Xem :h 'grepprg':h 'grepformat'để biết thêm thông tin. Bây giờ bạn có thể tìm kiếm thông qua :grep. ví dụ :grep 'foo'.

Là một dự phòng cuối cùng, bạn có thể sử dụng :vimgrepvì nó có sẵn trên tất cả các hệ thống mà Vim có sẵn. Xem :h :vimgđể được giúp đỡ thêm.

Danh sách QuickFix

Vì hầu hết các tùy chọn này sử dụng danh sách quickfix, tôi khuyên bạn nên sử dụng một số ánh xạ thân thiện hơn để chuyển qua danh sách quickfix. Tôi sử dụng Tim Pope không yếu đuối Plugin trong đó sử dụng ]q[qcho :cnext:cprevtương ứng. Một số người thích quickfix để mở sau khi tìm kiếm được thực hiện, sau đó thêm đoạn sau vào ~/.vimrctệp của bạn : autocmd QuickFixCmdPost *grep* cwindow. Bạn cũng có thể tự mở danh sách QuickFix qua :copen.

Muốn "tìm kiếm" nhanh hơn nữa?

Bạn sẽ cần sử dụng một số công cụ sử dụng các chỉ mục dựng sẵn như ctags , cscope hoặc GNU global .

  • Vim đã xây dựng trong hỗ trợ ctag qua :tag, <c-]>và nhiều lệnh khác và các tùy chọn. Xem :h tags. Cũng có thể muốn đọc Effagsless Ctags bằng Git hoặc xem qua plugin Gutentags
  • Hỗ trợ Cscope cũng được tích hợp và có thể được sử dụng thông qua :cscopelệnh. Xem:h cscope

Giúp đỡ nhiều hơn

Tôi sẽ bắt đầu với tập Vimcast hay này: Tìm kiếm nhiều tệp với:vimgrep .

Để biết thêm trợ giúp Vim xem tài liệu:

:h grep
:h :vimgrep
:h :grep
:h 'grepprg'
:h 'grepformat'
:h quickfix
:h :cnext
:h tags
:h cscope

6

Plugin GrepCommands của tôi xác định các biến thể của :vimgreplệnh tích hợp nhắm mục tiêu tất cả các đối số, bộ đệm được liệt kê, cửa sổ trong trang tab hiện tại hoặc tất cả các trang tab để tìm kiếm. Về cơ bản, một triển khai plugin mạnh mẽ cho câu trả lời của @ jecxjo.


1

Các lệnh :bufdo:vimgrepadd

Câu trả lời này dựa trên /programming//a/11976158/1057593 .

Tuy nhiên, tôi muốn thêm một vài bit. Một lần nữa lệnh cơ bản là

:bufdo vimgrepadd pattern %

Nếu danh sách quickfix của bạn không trống, có lẽ bạn muốn xóa nó trước (xem /programming//q/27385970/1057593 ). Điều này có thể được thực hiện với

:cexpr []

vim-unimpaired cung cấp các ánh xạ ]q[qxoay vòng qua các trận đấu.

cmdline-lịch sử

Đó là một quy trình công việc tốt để nhập riêng mẫu tìm kiếm /pattern. Điều này cho phép bạn sử dụng một lệnh chung từ lịch sử dòng lệnh của bạn bằng cách sử dụng mẫu tìm kiếm hiện tại. Điều này sẽ trông giống như

/pattern
:bufdo vimgrepadd // %

Một tìm kiếm bộ đệm mới điển hình sẽ là

/pattern2
:bufdo<up><up>...

Tôi đã thêm các ánh xạ sau vào vimrc của mình để sử dụng <C-N><C-P>thay vì các phím mũi tên

cmap <C-P> <Up>
cmap <C-N> <Down>

Để tìm kiếm lịch sử lệnh sử dụng q:, sau đó /bufdo<CR>và gọi một lệnh với <CR>. Để biết thêm chi tiết, hãy xem https://vim.fandom.com/wiki/Using_command-line_history và các trang trợ giúp :h history:h cmdline-window.

Bạn có thể thêm vào lệnh tái sử dụng :copenđể xem ngay danh sách quickfix theo cách sau:

:execute "bufdo vimgrepadd // %" | copen

Đề xuất từ ​​stackoverflow :bufdo vimgrepadd // % | copenđã mở một số cửa sổ ngoài ý muốn trong trường hợp của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.