Vim 구문 부분 일치
Vim 구문 파일에서 새 줄 문자를 찾으려고합니다. Vim 내에서 patern을 사용할 때 작동하도록 만들 수 있지만 구문 파일에 넣을 때 새 줄이있을 때 강조 표시되지 않습니다. 그래야합니다.
나는 새로운 라인의 일치에 사용하는 정규식 부분은 다음과 같습니다 \_s(도 함께 시도 \n와 : \(\n\|\s\))
patern : [,(]\(\_s*\w\+:\)\?\_s*\zs\w\+
patern의 단순화 된 버전 : [,(]\_s*\zs\w\+(예제와 질문의 목적이 동일 함)
내부 구문 파일 코드 .vim/syntax/python.vim:
syn match pythonFunctionParam '[,(]\_s*\zs\w\+'
[...]
hi link pythonFunctionParam Error
[...]
let b:current_syntax = 'python'
다음은 try를 재현하기위한 샘플 테스트 파일입니다 test.py.
a(matched_by_all=2, matched_by_all="anything")
b( matched_by_all=3,
matched_only_by_vim_search='test'
)
c(
matched_only_by_vim_search=3
matched_by_none="it's normal"
)
Vim 통합 검색 ( /[,(]\_s*\zs\w\+)을 사용하면 다음과 같은 일치 항목이 표시됩니다.
matched_by_all matched_by_all
matched_by_all
matched_only_by_vim_search
matched_only_by_vim_search
그래서 모든 것이 예상했습니다.
syn match동일한 정규식으로 구문 을 사용 하면 다른 일치 항목이 나타납니다 (덜 일치).
matched_by_all matched_by_all
matched_by_all
거기를 때 볼 수있다 (또는 ,이 새로운 라인의 경우 같은 줄에 일치하지만,하지.
그래서 내 질문은 : 내 구문 파일에서 동일한 일치를 얻는 방법은 무엇입니까?
답변
vim 구문 일치 regexp 엔진이 \zs및 \_s. 제거 \zs하면 일치하는 항목을 볼 수 있습니다.
나는 다른 접근 방식으로 갈 것입니다.
- 함수 매개 변수를 포함하는 투명한 함수 호출 영역 정의
- 포함 된 함수 매개 변수 정의
syn region pythonFunctionCall start='\k\+\_s*(\zs' end='\ze)' contains=pythonFunctionParam transparent keepend
syn match pythonFunctionParam '\k\+\(\s*=\s*[^,]\+\)\?' contained
hi link pythonFunctionParam Error
참고 : pythonFunctionParam은 조정할 수있는 간단한 예제 일뿐입니다.
\zs패턴이 시작될 때 동일한 행에서 일치해야한다는 점에서 구문 일치에서 작동 하는 방법에 대한 명시적인 예외 가 있습니다.
참조 :help syn-multi-line:
패턴에는 줄 끝과 일치하는 "\ n"이 포함될 수 있습니다. 대부분 예상대로 작동하지만 몇 가지 예외가 있습니다.
오프셋이있는 시작 패턴을 사용하는 경우 일치의 시작은 다음 줄에서 시작할 수 없습니다. 강조 표시는 다음 줄에서 시작할 수 있습니다. 항목을 사용
\zs하려면 일치 시작 부분이 다른 줄로 이동하지 않아야합니다.
대신 너비 가 0 인 look-behind 일치 를 사용하여이 문제를 해결할 수 있습니다 .
syn match pythonFunctionParam '\([,(]\_s*\)\@<=\w\+'
그러나 이러한 종류의 일치는 더 많은 비용이 드는 경향이 있습니다. 하나를 사용하는 경우 범위를 제한하십시오. Vim의 구문 엔진은 일치 범위를 좁히는 데 도움이되는 다른 메커니즘도 제공합니다. 예를 들어 특정 그룹이 특정 그룹 내에서 발생할 때만 일치시킬 수 있습니다. 이렇게하면 더 간단한 일치를 사용하여 이러한 종류의 구문을 구현하는 데 도움이 될 수 있습니다.