[컴] sublime text2 에서 custom syntax 정의하기


http://docs.sublimetext.info/en/latest/extensibility/syntaxdefs.html


Tools > Packages > Package Development > New Syntax Definition 로 시작하자. uuid 를 생성하기 위해서라도 이 메뉴를 통해 시작해야 한다.

그래서 여기에서 생성되는 uuid 를 가지고 .json 파일을 만들고 이녀석을 .plist 로 변환하고, 이 변환한 파일의 확장자를 .tmLanguage 로 변환해서 Package folder 에 넣으면 된다.

순서


  1. Tools > Packages > Package Development > New Syntax Definition
  2. .json 로 저장
  3. .json 을 .plist 로 변환(AAAPackageDev package 를 이용하면 된다. Package Control을 이용하자.)
  4. 확장자를 .tmLanguage 로 바꿈.
  5. Packages 폴더로 copy : c:\Users\namh\AppData\Roaming\Sublime Text 2\Packages\MyStyle\MyStyle.tmLanguage


scope

첫 scope 의 이름은 text.<lang_name> 이나 source.<lang_name> 으로 시작한다.[ref. 1]
이것은 java 의 package 나 python 의 module 같은 개념이다. 그래서 text.html 이라면 text 라는 package 안에 있는 html 이라는 뜻으로 받아드리면 되겠다.

이 scope 는  textMate 의 scope 의 개념을 가져왔다고 한다.

이 scope 를 이용해서 원하는 설정을 쉽게 가져올 수 있다. 아래 예제에서 name 에 쓰여져 있는 것들이 scope 이다. match 와 맞는 string 이 있으면 name 에 정의된 scope 의 syntax color 를 입히게 된다.

이 color 에는 scope 이 hardcoded 되어 있다. 그래서 특정 scope 을 사용하면 특정 color 가 나오게 된다. 그렇다고 해도 모든 scope 이 다른 color 를 가지고 있다는 것은 아니다.[ref. 1]

captures 는 regular expression 의 group 같은 개념이다. 그래서 ()(괄호) 로 묶여 있는 부분이 하나의 group 이 된다. 그것을 capture 에서 사용하는 것이다.
"captures": {
              "1": { "name": "constant.numeric.myst" }
           },
같은 경우는 match 중에 1번째 group 을 constant.numeric.myst 에 mapping 한다는 뜻이다.

begin, beginCaptures / end, endCaptures

begin, beginCaptures / end, endCaptures 는 html tag 같은 요소나 {} 처럼 시작 부분과 끝부분의 경계가 있는 경우에 사용하면 된다.

include

여기서
"patterns": [
               { "include": "$self" },
include : "$self" 는 begin 부분을 제외한 나머지 부분을 넘겨주는 역할을 한다.

syntax 예제

{   "name": "My Style",
    "scopeName": "source.mysty",
    "fileTypes": ["mysty", "myst"],
    "patterns": [
        { "match": "\\$\\d+",
          "name": "keyword.source.mysty",
          "comment": "Tab stops like $1, $2..."
        },
        { "match": "\\$([A-Za-z][A-Za-z0-9_]+)",
          "name": "keyword.source.myst",
          "captures": {
              "1": { "name": "constant.numeric.myst" }
           },
          "comment": "Variables like $PARAM1, $TM_SELECTION..."
        },

        { "name": "variable.complex.myst",
           "begin": "(\\$)(\\{)([0-9]+):",
           "beginCaptures": {
               "1": { "name": "keyword.myst" },
               "3": { "name": "constant.numeric.myst" }
           },
           "patterns": [
               { "include": "$self" },
               {  "name": "string.myst",
                  "match": "."
               }
           ],
           "end": "\\}"
        },
        {  "name": "invalid.ssraw",
            "match": "(\\$|\\<|\\>)"
        }

    ],
    "uuid": "c6771482-091a-4821-8f64-33e38564fc09"
}
위의 syntax definition 에 대한 실제 결과이다.


References


  1. Syntax Definitions

댓글 없음:

댓글 쓰기