tools/vim

Learn Vimscript The Hard Way - 46. Advanced Syntax Highlighting

seul chan 2020. 4. 26. 19:08

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.