열려있는 모든 버퍼에 대한 검색 결과를 표시하는 방법


17

내가 자주하는 일 (하지만 명령 줄에 의존하는 것)은 여러 파일을 검색 / grepping하는 것입니다.

열려있는 모든 버퍼에 대한 검색 결과를 표시하는 방법이 있습니까?

이상적으로는 결과 위치와 스 니펫이 포함 된 새로운 분할 버퍼를 원합니다 grep. 예를 들어 ( /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();

보너스로 커서 아래에서 용어를 검색 할 수 있기를 원합니다 gd.


답변:


15

:vimgrep /pattern/ {files}일치 패턴으로 빠른 수정 사항 목록을 채우는 데 사용할 수 있습니다 . 문제는 :vimgrep파일 옵션이 버퍼를 직접 허용하지 않는다는 것입니다. 당신이 사용할 수있는:

%   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}

다른 옵션은에서 파일 목록을 생성하는 스크립트를 작성하는 것 :buffers입니다. 당 이 SO 게시물을 우리가 얻을 약간의 형식에 설정을 몇과 함께 :

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>)

이제 :GrepBufs <expression>표준 :vimgrep출력을 호출 하고 버퍼를 대신 사용할 수 있습니다.

업데이트GrepBuffers 커서 아래의 값을 사용하여 호출 하려면이 새 매핑을 추가하십시오.

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

당신은 일반 모드 유형에있을 때 <leader>z당신거야 :vimgrep열려있는 버퍼 위에 커서를 단어.


2
한 줄 형식으로 : command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' '). 사용법 ::Bufgrep/foo/
피터 Rincker

8

열린 버퍼에서만 검색하는 것이 좋지만 전체 프로젝트에서 검색하려는 시간이있을 수 있습니다. 생각보다 빠르고 쉽습니다!

프로젝트에서 검색

  • grep유닉스 표준 검색 도구입니다. 편재성으로 언급 할 가치가 있습니다. :grep명령을 통해 이미 Vim에 통합되었습니다 . 예 :grep -r 'foo'. 참조하십시오 :h :grep.
  • Ack 는 VCS 디렉토리, 이진 파일을 건너 뛰고와 같은 특정 유형의 파일 형식을 검색 할 수 있기 때문에 일반 grep보다 빠릅니다 --perl. Vim 통합에 대해서는 Ack.vim을 참조하십시오
  • Ag Silver Silverer 는 ack와 유사하지만 더 빠른 코드 검색 도구입니다. Vim 플러그인 : Ag.vim
  • git grep저장소를 매우 빠르게 검색합니다. Fugitive.vim이 제공합니다 :Ggrep.
  • Ripgrep 은 Ag 및보다 빠릅니다 git grep. 함께 사용할 수 있습니다 :grep.

ripgrep, Ag 및 git grep모두 매우 빠르 므로 권장합니다 . 1 초 이내에 4700+ 이상을 검색했습니다. ripgrep을이기는 것은 매우 어렵습니다.

플러그인없이 이러한 대안 중 하나를 테스트하거나 단순히 플러그인을 원하지 않으면 'grepprg'옵션을 적절하게 설정할 수 있습니다. 예를 들어 set grepprg=ag\ --vimgrep또는 set grepprg=rg\ --vimgrep. 참조 :h 'grepprg':h 'grepformat'더 많은 정보를 얻을 수 있습니다. 이제를 통해 검색 할 수 있습니다 :grep. 예 :grep 'foo'.

최종 폴백으로 :vimgrepVim을 사용할 수있는 모든 시스템에서 사용할 수 있으므로 사용할 수 있습니다. :h :vimg도움이 더 필요하면 참조하십시오 .

QuickFix 목록

이러한 옵션의 대부분은 빠른 수정 목록을 사용하므로 빠른 수정 목록을 가로 지르기 위해보다 친숙한 매핑을 사용하는 것이 좋습니다. 나는 팀 교황의 사용 손상되지 않은 사용하는 플러그인 ]q[q에 대한 :cnext그리고 :cprev각각을. 검색을 수행 한 후 빠른 수정 프로그램을 열려면 다음을 ~/.vimrc파일에 추가하십시오 autocmd QuickFixCmdPost *grep* cwindow. 를 통해 QuickFix 목록을 수동으로 열 수도 있습니다 :copen.

더 빠른 "검색"을 원하십니까?

ctags , cscope 또는 GNU global 과 같은 사전 구축 된 색인을 사용하는 도구를 사용해야 합니다.

  • 빔을 통해 ctag 지원이 포함되어 있습니다 :tag, <c-]>그리고 많은 다른 명령과 옵션을 제공합니다. 참조하십시오 :h tags. Git 을 사용하여 Effortless Ctags 를 읽 거나 Gutentags 플러그인을 살펴볼 수도 있습니다.
  • Cscope 지원도 내장되어 있으며 :cscope명령을 통해 사용할 수 있습니다 . 보다:h cscope

추가 도움

나는이 좋은 시작하는 것 Vimcast의 에피소드 : 여러 파일을 검색합니다:vimgrep .

Vim 도움말에 대한 자세한 내용은 다음 설명서를 참조하십시오.

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

6

My GrepCommands 플러그인:vimgrep모든 인수, 나열된 버퍼, 현재 탭 페이지의 창 또는 검색을위한 모든 탭 페이지를 대상 으로하는 내장 명령 의 변형을 정의합니다 . 기본적으로 @jecxjo의 답변에 대한 강력한 플러그인 구현.


1

명령 :bufdo:vimgrepadd

이 답변은 /programming//a/11976158/1057593에 근거합니다 .

그러나 몇 비트를 추가하고 싶었습니다. 다시 기본 명령은

:bufdo vimgrepadd pattern %

빠른 수정 사항 목록이 비어 있지 않은 경우 먼저 정리하십시오 ( /programming//q/27385970/1057593 참조 ). 이것은 할 수 있습니다

:cexpr []

VIM-손상되지는 매핑 제공 ]q[q일치하는 순환에 있습니다.

cmdline-history

을 사용하여 검색 패턴을 별도로 입력하는 것이 좋습니다 /pattern. 이를 통해 현재 검색 패턴을 사용하여 명령 행 기록에서 일반 명령을 사용할 수 있습니다. 이것은 다음과 같습니다

/pattern
:bufdo vimgrepadd // %

일반적인 새로운 버퍼 전체 검색은

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

내가 사용 내의 vimrc에 다음과 같은 매핑을 추가 <C-N>하고 <C-P>대신 화살표 키의

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

명령 기록 사용을 검색하려면 q:다음 /bufdo<CR>과와 명령을 호출 <CR>. 자세한 내용은 참조 https://vim.fandom.com/wiki/Using_command-line_history 및 도움말 페이지 :h history:h cmdline-window.

재사용 가능한 명령 :copen에 추가 하여 다음과 같은 방법으로 빠른 수정 사항 목록을 즉시 볼 수 있습니다 .

:execute "bufdo vimgrepadd // %" | copen

stackoverflow의 제안은 :bufdo vimgrepadd // % | copen제 경우 의도하지 않은 여러 창을 열었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.