일치하는 줄만 표시 하시겠습니까?


31

긴 파일에서 약 200 줄 정도 일치하는 패턴을 검색하고 싶습니다. 일치하는 줄은 파일에서 임의의 위치에 있습니다.
라인이 일치하면 라인 자체 만 관련이 있으며 위 또는 아래의 컨텍스트는 없습니다.

일반적으로으로 검색 /하고 일치하는 항목을 탐색 n합니다.
그러나 이는 화면에 한 번에 하나 또는 두 개의 관련 줄만 있음을 의미합니다.

결과 줄 목록을 살펴보면서 일치하지 않는 모든 줄을 숨길 수있는 방법이 있습니까?


무차별 대입 방식은 일치하지 않는 모든 행을 삭제하고 나중에 삭제를 취소하는 것입니다. 그러나 그것은 영구적 인 취소로 끝나지 않더라도 다양한 방식으로 추악합니다 ...

답변:


34
:vimgrep pattern %
:cwin

vimgrep현재 파일 ( %) 또는 지정한 파일에서 패턴을 검색합니다 .

cwin그런 다음 창에서 원하는 줄만 표시하는 버퍼를 엽니 다. cwin버퍼 내에서 거의 모든 탐색 / 검색 명령을 사용할 수 있습니다 . 소스 파일에서 커서 아래의 행으로 이동하려면 return을 누르십시오.


1
:vimgrep로 축약 할 수있다:vim
D. 벤 Knoble

버퍼로 다시 돌아가려면 어떻게해야합니까?
pasha

또한 버퍼를 어떻게 닫습니까? 미리 감사드립니다
pasha

quickfix (cwindow) 버퍼에서 모든 라인의 return 키를 눌러 원래 버퍼의 해당 위치로 이동할 수 있습니다. 언제 어디서나 cwindow 버퍼를 닫을 수 :ccl[ose]있지만 일반적으로 버퍼를 닫습니다 (예 : 및으로 전환 :bd). 다시 실행하여 빠른 수정 버퍼를 :cw[indow]다시 열면 마지막 vimgrep 결과가 사용됩니다.
Zach Ingbretsen

15

당신은 모든 일치하는 줄을 나열 할 수 있습니다

:g/{pattern}

(이 :print명령은 생략 할 수 있으며 기본값은 :g입니다.)


1
이것은 (이하 "원래 그렙"입니다 g/REgexp/p) ... 문제는 ...하지만, 쉽게 경기 중 하나에 점프 할 수 없다는 것입니다
마틴 Tournoij

@Carpetsmoker : 네 말이 맞아. 이를 위해 플러그인이 있습니다. 다른 답변을 참조하십시오.
Ingo Karkat

많은 경우에 유용 할 수 있습니다. 출력을 새 버퍼로 리디렉션 할 수 있습니까? 그것은 여전히 ​​라인에 구문 강조를 허용합니다. (흠 ... 그것은 또 다른 질문을 제기하고 잠시 기다립니다 ...)
Volker Siegel

@ IngoKarkat 의미는 무엇입니까 g. 나는 그것이 세계적인 패턴이라고 가정합니다. 일반적으로 슬래시로 VI 검색을 수행하면 /pattern모든 발생을 찾습니다. 하나는 편지 눌러 그들로 이동할 수 있습니다n
알렉산더 CSKA

@AlexanderCska : 아니요, 검색을위한 수정자가 아니라 :g[lobal]패턴을 인수로 취하는 별도의 명령 입니다. 자세한 내용은에서 확인할 수 :help :global있습니다.
Ingo Karkat

12

foldmethodfoldexpr옵션을 사용하여 관련없는 선을 접을 수 있습니다.

검색 후 마지막 검색은 @/레지스터에 저장됩니다 . 따라서 다음과 같이 일치하지 않는 모든 항목을 쉽게 접을 수 있습니다 (한 줄만 일치).

:setlocal foldexpr=getline(v:lnum)=~@/?0:1 foldmethod=expr

Vim Tips Wiki 에서 컨텍스트 라인을 위해 여러 레벨의 폴딩을 추가하거나 여러 라인을 매칭하는 것과 같은 고급 방법을 찾을 수 있습니다 .


set foldlevel=0필요한 것 같습니다 ? 그러나 이것이 기본값 일 수 있습니다.
Volker Siegel

1
예, 기본값은 0이지만 그것이 없으면 작동하지 않으면 추가 할 수 없습니다. :-)
Ben

그러나 이제 ... 흔적을 남기지 않고 다시 전환하는 방법은 무엇입니까?
Volker Siegel

일반 모드에서는 'zi'를 사용하여 접기를 켜거나 끌 수 있습니다.
John O'M.

내가 이것을 할 때 대부분의 시간에 나는 먼저 :tab sp파일에 대한 새로운 전망을 얻는다. 그런 다음 돌아가는 것은 간단 :close하거나 탭을 죽이는 다른 방법입니다.
Ben

6

순서가 중요하지 않으면 선을 이동하십시오.

:g/pat/m0

자세한 내용은 다음을 참조하십시오.

:h :g
:h :m

1
그리고 :g/pat/m$(마지막에 일치하는 라인을 이동), OK도
러너 장

6

[d] 일치하지 않는 모든 줄 (!) :

:g!/pattern/d

또는 더 간단합니다 ( 'B Layer'의 의견 감사).

:v/pattern/d

예, 그러나 :v보다 동등한 것을 사용하는 것이 더 일반적 :g!입니다. (내가 마지막으로 사용한 TBH를 마지막으로 본 기억이 없습니다!)
B Layer

2

당신이 (내 다른 대답으로) 일치하는 모든 라인을 나열하고 싶다면 점프 하나의 특정 경기에 내 FindOccurrence 플러그인은 제공 [/(그리고 그것을위한 매핑 [n대신 하나를 쿼리의 마지막 검색 패턴을). [/pattern같은 목록을 표시 :g/pattern한 다음 점프 할 번호를 요청합니다.


0

다른 방법은을 사용 :h :ilist하는 것입니다. 맨 페이지 개요를 얻는 데 사용합니다. 결과는 다음과 같습니다.

~/find.~
  1:    3 NAME
  2:    6 SYNOPSIS
  3:    9 DESCRIPTION
  4:   18 OPTIONS
  5:   93 EXPRESSION
  6:  779 EXAMPLES
  7:  877 HISTORY
  8:  931 BUGS

다음은 색인별로 결과 행으로 이동하도록 선택할 수있는 작은 기능입니다.

function! s:select_ilist(ilist_result)
  if empty(a:ilist_result) || a:ilist_result =~# '^\_s*Error'
    return
  endif

  let select = input(a:ilist_result . "\ngoto : ")
  if empty(select) | return | endif

  " ilist result starts with '\nfilename\n', filename can be empty
  let lines = split(a:ilist_result[stridx(a:ilist_result, "\n", 1) : ], "\n")
  if select <= 0 || select > len(lines) | return | endif

  exec matchstr(lines[select-1], '^\v\s*\d+\:\s+\zs\d+')
endfunction

다음과 같이 사용할 수 있습니다 :

command! -buffer Section call s:select_ilist(execute('silent! ilist /\v\C^[A-Z][^a-z]+$/'))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.