Learn Vimscript The Hard Way - 45. Basic Syntax Highlighting
Basic Syntax Highlighting
이제 potion plugin을 작성하기 위한 기본적인 boilerplate를 작성했다. 이제 간단한 syntax 하이라이팅부터 시작해볼 것이다.
syntax/potion.vim
을 만들고 다음 코드를 추가해보자.
if exists("b:current_syntax")
finish
endif
echom "Our syntax highlighting code will go here."
let b:current_syntax = "potion"
이제 factorial.pn
을 열어보자. 다른 플러그인의 동작에 따라 위 메세지가 보일 수도, 보이지 않을 수도 있다. :messages
명령어를 실행시키면 위에서 작성한 syntax/potion.vim
이 로드된 것을 확인할 수 있다.
potion 파일 (
factorial.pn
을 열 때에는 split/tab이 아니라 새로운 vim window/instance에서 열어야 이전에 작성한 플러그인이 완벽하게 로드 될 것이다.
Highlighting Keywords
나머지 챕터에서 우리는 위 코드에서 if
와 let
은 일단 무시할 것이다. 해당 줄들을 지우지는 말고, 일단 잊어버리고 있어라.
echom
줄을 다음 코드로 바꿔주자.
syntax keyword potionKeyword to times
highlight link potionKeyword Keyword
factorial.pn
을 다시 열어보자. to
와 times
가 하이라이트 된 것을 볼 수 있다!
위 두 줄은 vim의 syntax highlighting의 기본 구조를 보여준다.
- 먼저
syntax keyword
를 사용하여 syntax 덩어리를 정의하였다. - 이 덩어리들을 Highlighting 그룹과 링크시켰다.
이는 plugin 작성자가 syntax 덩어리를 정의할 수 있게 해주고, 이를 highlighting 그룹과 링크시킬 수 있게 해준다. 뿐만 아니라 color scheme 작성자가 각각의 프로그래밍 언어를 알지 못하더라도 기본적인 프로그래밍 구조를 만들 수 있게 해준다.
potion은 기존에 사용하지 않는 많은 키워드를 가지고 있기 때문에 이들도 highlighting 해주자.
syntax keyword potionKeyword loop times to while
syntax keyword potionKeyword if elsif else
syntax keyword potionKeyword class return
highlight link potionKeyword Keyword
먼저, 마지막 줄은 변하지 않았다. 우리는 여전히 potionKeyword
syntax group에 있는 모든 문법을 Keyword
로 하이라이팅 시킬 것이다.
사실
factorial.pn
에서는 방금 추가한 것들이 없기 때문에 딱히 달라진 게 없어 보일 수 있다.if
,return
등을 적어보면 바로 highlighting 되는 것을 볼 수 있다.
그리고 syntax keyword potionKeyword
로 시작하는 세 줄을 적었다. 이는 해당 줄을 여러 번 실행시켜도 syntax group을 리셋하지 않고 이들을 모두 더해준다는 말이다.
이는 당신이 그룹을 여러가지 방식으로 정의할 수 있게 해 준다는 말이다.
- 모든 것을 한 줄에 적을 수 있다.
- 이들을 80 컬럼씩 나누어 읽기 쉽게 할 수 있다.
- 이들을 각 그룹으로 나누어서 더 보기 좋게 할 수 있다.
- 위에서 한 것처럼 각각을 연관된 것들끼리 그룹화 시킬 수 있다.
Highlighing Functions
또 다른 vim의 기본 하이라이팅 그룹은 Function
이다. 빌트인 Potion 함수들을 우리의 하이라이팅 스크립트에 추가해보자.
syntax keyword potionKeyword loop times to while
syntax keyword potionKeyword if elsif else
syntax keyword potionKeyword class return
syntax keyword potionFunction print join string
highlight link potionKeyword Keyword
highlight link potionFunction Function
factorial.pn
을 다시 열어보자. potion의 빌트인 함수들이 하이라이트 된 것을 볼 수 있다.
이는 keyword 하이라이팅과 동일하게 동작한다. 우리는 새로운 syntax group을 만들어 이를 다른 하이라이팅 그롭에 연결시켰다.
Exercises
Think about why the if exists and let lines at the beginning and end of the file are useful. If you can't figure it out, don't worry about it. I had to ask Tim Pope to be sure.
Skim over
:help syn-keyword
. Pay close attention to the part that mentions iskeyword.Read
:help iskeyword
.
iskeyword에 대해서는 다른 포스트에 따로 정리할 예정
- Read
:help group-name
to get an idea of some common highlighting groups that color scheme authors frequently use.
*Comment any comment
*Constant any constant
String a string constant: "this is a string"
Character a character constant: 'c', '\n'
Number a number constant: 234, 0xff
Boolean a boolean constant: TRUE, false
Float a floating point constant: 2.3e10
*Identifier any variable name
Function function name (also: methods for classes)
*Statement any statement
Conditional if, then, else, endif, switch, etc.
Repeat for, do, while, etc.
Label case, default, etc.
Operator "sizeof", "+", "*", etc.
Keyword any other keyword
Exception try, catch, throw
*PreProc generic Preprocessor
Include preprocessor #include
Define preprocessor #define
Macro same as Define
PreCondit preprocessor #if, #else, #endif, etc.
*Type int, long, char, etc.
StorageClass static, register, volatile, etc.
Structure struct, union, enum, etc.
Typedef A typedef
*Special any special symbol
SpecialChar special character in a constant
Tag you can use CTRL-] on this
Delimiter character that needs attention
SpecialComment special things inside a comment
Debug debugging statements
*Underlined text that stands out, HTML links
*Ignore left blank, hidden |hl-Ignore|
*Error any erroneous construct
*Todo anything that needs extra attention; mostly the