Làm thế nào để đi đến kết quả grep tiếp theo?


7

Tôi đang sử dụng grepđể tìm sự xuất hiện chức năng trong một dự án.

:grep "set_val" *

Đi ra khỏi vim và đầu ra:

code.py:68:        self._device.set_val('Level', new_level)
code.py:84:        self._device.set_val("Mode", "Remote")
Press ENTER or type command to continue

Tôi nhấn enter và code.py:68đây là lần xuất hiện đầu tiên.

Làm thế nào để tôi di chuyển đến sự xuất hiện khác?


1
Làm thế nào về việc mở cửa sổ qf?
Kent

Câu trả lời:


21

:grep/ :vimgrepcả hai sử dụng danh sách quickfix để lưu trữ vị trí. Như bạn đã nhận thấy vim sẽ tự động chuyển sang lần xuất hiện đầu tiên (sử dụng !để tránh hành vi này). Chỉ cần sử dụng :cnextđể đi đến vị trí tiếp theo trong danh sách quickfix.

Lệnh Quickfix

  • :cnext/ :cpreviousđể điều hướng quickfix tiến và lùi trong danh sách quickfix
  • :cfirst/ :clastđể chuyển đến đầu và cuối danh sách quickfix
  • Sử dụng :copenđể mở cửa sổ quickfix. Sử dụng <cr>để nhảy đến một mục
  • Sử dụng :ccloseđể đóng cửa sổ quickfix
  • Sử dụng :ccđể hiển thị lỗi hiện tại.
  • :colder/ :cnewerđể nhảy danh sách quickfix cũ hơn / mới hơn

Tôi muốn giới thiệu bạn tạo ánh xạ cho :cnext:cprevious. Cá nhân tôi sử dụng unimpaired.vim cung cấp ]q& [qánh xạ cho :cnext:cprevious.

Nếu bạn muốn cửa sổ quickfix mở tự động, hãy đặt phần sau vào vimrc:

augroup autoquickfix
    autocmd!
    autocmd QuickFixCmdPost [^l]* cwindow
    autocmd QuickFixCmdPost    l* lwindow
augroup END

Có một tập Vimcasts về chủ đề này: Tìm kiếm nhiều tệp với: vimgrep .

Tìm kiếm và thay thế trên toàn dự án

Nếu bạn đang sử dụng :grep/ :vimgrepnhư một cách để thực hiện tìm kiếm trên toàn dự án và thay thế thì tôi khuyên bạn nên sử dụng :cdo/ :cfdo(trong Vim 7.4.980+).

:grep 'foo'
:cfdo %s/foo/bar/g|w

Nếu phiên bản Vim của bạn không có :cdo/ :cfdođặt các lệnh sau trong vimrctệp của bạn để cung cấp :Cdo/ :Cfdocác lệnh thay thế.

if !exists(':cdo')
  command! -nargs=1 -complete=command Cdo try | sil cfirst |
        \ while 1 | exec <q-args> | sil cn | endwhile |
      \ catch /^Vim\%((\a\+)\)\=:E\%(553\|42\):/ |
      \ endtry

  command! -nargs=1 -complete=command Cfdo try | sil cfirst |
        \ while 1 | exec <q-args> | sil cnf | endwhile |
      \ catch /^Vim\%((\a\+)\)\=:E\%(553\|42\):/ |
      \ endtry
endif

Sử dụng một chương trình thay thế cho :grep

Đôi khi grepkhông đủ tốt cho nhu cầu tìm kiếm của bạn. Bạn có thể thay đổi :grepchương trình của mình thông qua 'grepprg'cài đặt (cũng có thể cần thay đổi 'grepformat'). Cá nhân tôi sử dụng ripgrep bằng cách thêm phần sau vào vimrctệp của mình theo hướng dẫn trong rgtrang man của:

set grepprg=rg\ --vimgrep
set grepformat^=%f:%l:%c:%m

Lưu ý: Có thể muốn sử dụng -Scờ, ví dụ: set grepprg=rg\ -S\ --vimgrepđể sử dụng tìm kiếm "trường hợp thông minh" (tìm kiếm không phân biệt chữ hoa chữ thường khi tất cả các chữ cái viết thường).

Bây giờ :grepsẽ sử dụng rgđể tìm kiếm. ví dụ :grep foo -t js.

Đây là một vài chương trình grep thay thế để xem xét: ack , ag , ripgrepgit grep( Fugitive.vim cung cấp :Ggreptrình bao bọc)

Để được trợ giúp thêm xem:

:h :grep
:h 'grepprg'
:h quickfix
:h :cnext
:h :copen
:h :ccl
:h :cc
:h :colder
:h :cdo
:h :cfdo

Cảm ơn câu trả lời tuyệt vời. Mã của bạn để tự động mở cửa sổ quickfix hoạt động, nhưng đối với tôi nó mở và sau đó tôi phải sử dụng các lệnh để nhảy tới nó (ctr + w và mũi tên xuống). Tôi có thể thêm một dòng để tự động nhảy con trỏ vào cửa sổ quickfix sau khi nó tự động mở không? Cảm ơn bạn. -Asaf
Asaf

Sử dụng :cwindow/ :copenbên trong QuickFixCmdPostsự kiện autocmd sẽ khôi phục bộ đệm hiện tại sau khi bắn. Bạn có thể thêm :wincmd bhoặc bất kỳ lệnh cửa sổ nào bạn muốn autocmd, nhưng cửa sổ sẽ được khôi phục. Điều này được ám chỉ trong :h autocmd-use. Nếu bạn nghĩ về nó, hành vi này có ý nghĩa vì bạn có thể có nhiều autocmd gắn liền với một sự kiện, tất cả đều có những giả định nhất định như bộ đệm hiện tại. Tôi tưởng tượng cách để buộc vấn đề sẽ là bọc nó vào lệnh quickfix của bạn. ví dụ:command! Grep -nargs=+ grep <args> | cwindow
Peter Rincker
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.