Learn Vimscript The Hard Way - 46. Advanced Syntax Highlighting
Advanced Syntax Highlighting
지금까지 우리는 potion file에 대해 기본적인 하이라이팅을 추가하였다.
만약 저번 장(Basic syntax highlighting)을 공부하지 하지 않았다면 가서 하고 오길 바란다.
Highlighting Comments
Potion에서 꼭 필요한 하이라이팅 중 하나는 주석이다. Potion 주석은 #
으로 시작하는데, 이는 iskeyword
에 포함되지 않기 때문에 문제가 발생한다.
iskeyword
의 뜻을 모른다면 위의 얘기를 듣지 않은 것이다. "Go back and do the damn exercises." (실제로 이렇게 적혀있음 ㅋㅋ)
#
이 키워드 캐릭터가 아니기 때문에 이것과 주석을 매치시킬 수 있는 정규표현식이 핑료하다. 그래서 syntax keyword
대신에 syntax match
를 사용할 것이다.
syntax match potionComment "\v#.*$"
highlight link potionComment Comment
이를 syntax/potion.vim
파일에 추가한 후 factorial.pn
파일을 다시 열어보자. 주석을 작성하면 하이라이팅 된 것을 볼 수 있다.
위 명령어의 두 번째 줄은 간단하다. potionComment
syntax group을 Comment
로 하이라이팅 시키는 것이다.
첫 줄은 새로운 것이다. 우리는 syntax match
를 사용하여 vim에게 실제 키워드가 아닌 정규표현식을 사용하게 하였ㅅ다.
\v
를 사용하여 "very magic" 모드의 정규표현식을 사용한 것에 주목하라. 이게 무슨 의미인지 모른다면 이전 정규표현식 장을 참고 (vimscript Basic regular expression 블로그 글)
위 케이스에서는 "very magic" 모드가 필수는 아니다. 하지만 우리가 이후에 정규표현식을 수정하면 안 될 가능성이 있기 때문에 항상 "very magic" 모드를 사용하기를 권한다.
정규표현식 자체는 아주 단순하다. #
로 시작되는 줄의 끝까지 모든 캐릭터를 지칭한다.
Highlighting Operators
Potion에서 하이라이팅이 필요한 또 다른 파트는 operators이다.
syntax match potionOperator "\v\*"
syntax match potionOperator "\v/"
syntax match potionOperator "\v\+"
syntax match potionOperator "\v-"
syntax match potionOperator "\v\?"
syntax match potionOperator "\v\*\="
syntax match potionOperator "\v/\="
syntax match potionOperator "\v\+\="
syntax match potionOperator "\v-\="
highlight link potionOperator Operator
factorial.pn
을 다시 열어보자. *=
가 새롭게 하이라이트 된 것을 볼 수 있다.
먼저 주목할 점은 키워드에서 했던 것처럼 각각의 정규표현식을 다른 줄로 구성한 것이다. 이는 syntax match
가 한 줄에 여러 그룹을 지원하지 않기 때문이다.
또 하나는 반드시 필요하지 않더라도 \v
를 추가한 것이다. 나(저자)는 정규표현식에 몇 개의 캐릭터가 더 필요하더라도 일관적으로 쓰는 것을 선호하기 때문이다.
"\v-\=?"
를 사용하지 않은 것을 궁금해 할 수도 있다. 그렇게 해도 전혀 -
와 -=
를 하이라이팅 하는데는 전혀 무방하다. 저자는 그냥-
와 -=
가 완전 별개의 operator라고 생각하여 다른 줄로 구성하였다.
또 =
를ㄹ operator로 추가하지 않았따. 이는 이후에 추가할 예정인데, 그 이유는 다음고가 같다.
-=
를 -
다음에 정의하였는데, 이렇게 순서를 하지 않으면 -
를 매칭하고 남은 캐릭터를 =
로 매칭할 수 있기 때문이다. 이는 syntax match
의 각각 그룹이 파일의 부분을 사용하면 다른 줄에서 매칭되지 않는 것을 보여준다.
이는 지나친 단순화일 수 있지만, 아직은 디테일의 수렁에 빠지고 싶지 않기 때몬이다. 일단은, 큰 그룹을 먼저 만들고 이후에 작은 그룹을 만드는 원칙에 집중하자.
이제 =
를 추가해보자. 이 줄을 어디에 넣는 것이 좋을지 잠시 생각한 뒤에 직접 추가해보자.
syntax match potionOperator "\v\="
Exercises
Read
:help syn-match
.Read
:help syn-priority
.
1. When multiple Match or Region items start in the same position, the item
defined last has priority.
2. A Keyword has priority over Match and Region items.
3. An item that starts in an earlier position has priority over items that
start in later positions.
- We didn't make : an operator in our example. Read the Potion docs and make a conscious decision about whether to make : an operator. If you decide to do so, add it to the syntax file.
:
앞에 오는 인자나 명령어까지만 하이라이팅 하고 싶어서 아래아 같이 추가하였다.
syntax match potionOperator "\v\s\S*\:"
- Do the same for . and /.
마침표(
.
)는:
의 마침을 의미한다
- Add a syntax group potionNumber that highlights numbers. Link it to the highlight group Number. Remember that Potion supports numbers like 2, 0xffaf, 123.23, 1e-2, and 1.9956e+2. Remember to balance the time it takes to handle edge cases with the amount of time those edge cases will actually be used.