vim 구문 영역을 터치 / 오버랩 할 수 있습니까?


13

그래서 얼마 전에 vim의 구문 파일이 어떻게 작동하는지에 대해 더 많이 배우기로 결정했습니다. 내 목표는 파일을 구분 기호를 기준으로 3 개 부분으로 나누고이 세 부분 중 2 개에 대한 기존 구문 파일을 포함하는 간단한 구문 파일을 만드는 것이 었습니다.

이것은 예제 파일입니다.

Some text, unstyled

==================== Log
(Output of git log)

==================== Diff
(Output of diff)

목표는 두 헤더를 제외하고 git.vim로그와 diff.vimdiff에만 적용 하는 것이 었습니다 . 1 이것은 내 구문 파일이 다음과 같이 생겼습니다.

if exists("b:current_syntax")
    finish
endif

syntax include @gitlog $VIMRUNTIME/syntax/git.vim
syntax region GitLog
    \ start=/^===* Log/
    \ end=/^===* Diff/
    \ contains=@gitlog

syntax include @gitdiff $VIMRUNTIME/syntax/diff.vim
syntax region Diff
    \ start=/^===* Diff/
    \ end=/\n\n/
    \ contains=@gitdiff

let b:current_syntax = "logdiff"

참고 방법 end제 1 영역에서와 동일한 start제 2 영역에. 작동하지 않습니다. 두 번째 영역은 명백하게 감지되지 않고 구문 강조가 적용되지 않습니다.

정규식을 end=/^===/and 로 풀면 작동 할 수 start=/=== Diff/있으므로 영역이 닿지 않지만 특히 좋아하지는 않습니다. 다른 쪽 끝에서 시작해야한다는 것은 분명하지 않습니다.

두 개의 지역 정의가 동일한 문자를 터치하도록 허용하고 (또는 일치하는 가장자리를 포함하는 대신 독점적으로 만들 수있는) 방법이 있습니까? 아니면 느슨한 정규식에 갇혀 있습니까?

1 (예, git.vim포함하는 것을 알고 diff.vim있지만 이것은 학습 운동이었습니다)


"Region End"오프셋을 사용하여 가장자리를 배타적으로 만들 :h :syn-pattern-offset거나 (참조 ) GitLog 영역을 파일 끝까지 확장하고 Diff 영역을 GitLog 영역 안에 완전히 넣으면 이것이 가능해야한다고 생각합니다. . 그래도 이러한 방법 중 하나를 사용할 수 없었습니다.
Rich

git.vim은 이미 diff 출력을 강조 표시한다는 사실에 의해 테스트가 다소 어려워졌습니다. 이에 따라 모범을 바꾸는 아이디어가 될 수 있습니다!
Rich

답변:


4

Vim 정규식 엔진에 다음 경기 시작 위치를 알려줄 수 있습니다.

지금까지 두 가지 방법이 있다는 것을 알고 있습니다.

  1. \ze일치 종료를 설정하는 데 사용하십시오 .

    syntax region GitLog
        \ start=/^===* Log/
        \ end=/\ze^===* Diff/
        \ contains=@gitlog
    
  2. \@=Vim에서는 양의 lookahead를 사용합니다 .

    syntax region GitLog
        \ start=/^===* Log/
        \ end=/\(^===* Diff\)\@=/
        \ contains=@gitlog
    

그래서 끝 일치 "포인터"가지 처음으로 되감기의 ^===* Diff라인 같은 것을 region Diff들 ' start에서의 일치가 시작됩니다 ^===* Diff다시 라인을.

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