정규식 검색 패턴으로 접기


13

공백으로 구분 된 값 열이있는 일반 텍스트 파일이 있습니다. 이처럼 :

AU 3030 .... ... ....  
AU 3031 .... ... ....  
AU 3032 .... ... .... 
AU 3033 .... ... .... 
IT 48100 ... .. .....
IT 40100 ... .. .....
IT 48123 ... .. .....
UK 3333 ... ... ..... 
UK 4444 ... ... .....
UK 5555 ... ... .....

나는 또한 마지막 정규 표현식을 제외하고 첫 번째 열에서 동일한 값을 가진 인접한 줄과 일치하는이 정규 표현식을 얻었습니다 (파일이 첫 번째 열에서 정렬되었다고 가정).

/^\(\([A-Z0-9]\+\)\s\+.*\n\)\(\2\)\@=

(또는 덜 "털이 많은"것) :

/^\v([A-Z0-9]+)\s+.*\n(\1)@=

일치하지 않는 줄 위로 줄을 접을 수 있습니까? 이 결과를 얻는 것 :

+-- 4 lines AU ....
+-- 3 lines IT ....
+-- 3 lines UK ....

답변:


14

set foldmethod=expr와 사용 'foldexpr'겹 시작 지점을 정의하는 정력 스크립트 식을 설정합니다.

set foldmethod=expr
set foldexpr=get(split(getline(v:lnum-1)),0,'')!=get(split(getline(v:lnum)),0,'')?'>1':'='

공백을 쉽게 사용할 수는 :set없지만 공백과 개행 또는 2를 사용하면 다음과 같이 보입니다.

get(split(getline(v:lnum - 1)), 0, '') != get(split(getline(v:lnum)), 0, '')
    \ ? '>1'
    \ : '='

개요

기본적으로 이것은 각 줄의 첫 단어를 이전 줄과 비교합니다. 단어가 다르면 줄이 접기 시작입니다 >1. 그렇지 않으면 동일한 폴드 레벨을 유지합니다 =.

세부의 영광

  • set foldmethod=expr Vim에게 vim 스크립트 표현식을 사용하여 폴딩을 결정하도록 지시
  • 'foldexpr' 옵션은 vim 스크립트 표현식을 보유합니다
  • >1접기가 시작될 =때와 접기 수준이 계속 되어야하는시기 를 반환하는 3 항으로 조건을 평가합니다.
  • v:lnum'foldexpr'접기를 업데이트하기 위해 실행중인 현재 줄입니다.
  • 다음을 통해 현재 줄 ( v:lnum)과 이전 줄 ( v:lnum - 1) 의 내용을 가져옵니다.getline()
  • 를 통해 각 줄을 단어로 나눕니다. split()
  • get()새롭게 분리 된 단어의 첫 번째 색인을 얻는 데 사용
  • ''빈 줄인 경우 기본값을 사용하십시오 . 예 :get(words, 0, '')
  • 현재 행의 첫 번째 단어를 3 진의 조건 부분에서 이전 행의 첫 번째 단어와 비교

참고 :이 방법은 매우 큰 문서에서 일부 성능 문제가있을 수 있습니다.

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

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