2017-11-16 1 views
1

충돌하는 두 정규 표현식에, 나는 / 앞에 모든 라인의 단어를 캡처 한 hi def link에 할당하려고 노력하고 있어요 두 번째 모든 줄의 단어 (//으로 묶음)을 두 번째 hi def link에 할당합니다. argTwo빔 정규식 : 사내 언어에 대한 문법 파일을 작성하려고에서

cmo/create/mo1///tri 
createpts/brick/xyz/2,2,2/0.,0.,0./1.,1.,1./1,1,1 
내가 cmo을 포착하려고

argOnecreateptscreatebrick : 구문에 대한

syn match argOne '^\zs[^\/]\+\ze\/' 
syn match argTwo '^[^\/]\+\/\zs[^\/]\+\ze\/' 

hi def link argOne   Type 
hi def link argTwo   Statement 

문제는 그들이 충돌이 : 때 모두 sys match을 문이있는 경우 Vim은 argOne에서 발견 된 문구 만 캡처합니다. 그러나 두 개의 파일 중 하나 인 syn match 중 하나가 주석 처리 된 경우 argOne 또는 argTwo이 완벽하게 작동합니다.

어떻게이 두 문장을 서로 멋지게 연출할 수 있습니까?

syn match argOne '^\zs[^\/]\+\ze' contained 
syn match argTwo '\/\zs[^\/]\+\ze\/' contained 
syn match argOneTwo '^\zs[^\/]\+\/[^\/]\+\ze\/' contains=argOne,argTwo 

hi def link argTwo   Statement 
hi def link argOne   Type 

답변

1

하나의 솔루션이 포함 된 일치를 만들 처음 두 인수를 일치하는 argOneTwo을 정의하고 제 1 및 제 2 경기 일치를 제공하는 것입니다 일치하는 구문 그룹 이것은 개별 구문 그룹을 포함하는 상위 그룹을 정의하는 @ herbert의 솔루션보다 더 잘 확장됩니다. nextgroup=...를 통해 지시 할 때 만 일치되도록

syntax match argOne "^[^/\\]\+" nextgroup=sepOne 
syntax match sepOne "/" contained nextgroup=argTwo 
syntax match argTwo "[^/\\]\+" contained 

참고 sepOneargTwocontained 속성을 가지고있다. 그것 없이는, 그들은 더 많은 위치에서 일치 할 것입니다.

+0

위대한 작품! 고맙습니다! –

1

당신은의 순서를 구축 할 nextgroup=...를 사용할 수 있습니다