tools/vim

Learn Vimscript The Hard Way - 45. Basic Syntax Highlighting

seul chan 2020. 4. 25. 22:49

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

나머지 챕터에서 우리는 위 코드에서 iflet은 일단 무시할 것이다. 해당 줄들을 지우지는 말고, 일단 잊어버리고 있어라.

echom 줄을 다음 코드로 바꿔주자.

syntax keyword potionKeyword to times
highlight link potionKeyword Keyword

factorial.pn을 다시 열어보자. totimes가 하이라이트 된 것을 볼 수 있다!

위 두 줄은 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