그래서 얼마 전에 vim의 구문 파일이 어떻게 작동하는지에 대해 더 많이 배우기로 결정했습니다. 내 목표는 파일을 구분 기호를 기준으로 3 개 부분으로 나누고이 세 부분 중 2 개에 대한 기존 구문 파일을 포함하는 간단한 구문 파일을 만드는 것이 었습니다.
이것은 예제 파일입니다.
Some text, unstyled
==================== Log
(Output of git log)
==================== Diff
(Output of diff)
목표는 두 헤더를 제외하고 git.vim
로그와 diff.vim
diff에만 적용 하는 것이 었습니다 . 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
있지만 이것은 학습 운동이었습니다)
:h :syn-pattern-offset
거나 (참조 ) GitLog 영역을 파일 끝까지 확장하고 Diff 영역을 GitLog 영역 안에 완전히 넣으면 이것이 가능해야한다고 생각합니다. . 그래도 이러한 방법 중 하나를 사용할 수 없었습니다.