言語パッケージは、Tab キーを押したときに残りが表示されるようにするための「補完定義」と、カラーハイライトなどを行うための「構文定義」の2つの側面を定義したものです。まずは、コード補完に関するファイルを作成します。その後で構文定義も作成しますが、長いため別記事に書きます。
事前準備
まずは、仮の構文定義ファイルとして、拡張子が .tmLanguage のファイルをパッケージディレクトリに作成しておきます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>fileTypes</key>
<array>
<string>拡張子</string>
</array>
<key>name</key>
<string>構文名</string>
<key>patterns</key>
<array>
</array>
<key>scopeName</key>
<string>source.構文名</string>
<key>uuid</key>
<string>9b597cba-0612-4f3d-8e02-edaa14abdc95</string>
</dict>
</plist>
拡張子は、補完を行うファイルの拡張子。構文名は、何でもよいので識別できる名前(言語の名称など)にします。ここで scopeName に対応した値 (source.構文名) が、後で必要になってきます。
作成するファイル
- Completion ファイル (.sublime-completions)
- Snippet ファイル (.sublime-snippet)
Completion でできることは Snippet でもできますが、Snippet には1ファイルに1個しか定義が書けません。このため、Completion には型の名前・定数・関数など、Snippet にはイベントや制御構文を書いていくことにします。
Completion ファイル
{
"scope": "source.ext, source.dxt",
"completions":
[
// Types
"integer ",
"float ",
"key ",
"list ",
"rotation ",
"string ",
"vector ",
// Flow Controls
"jump ",
"return",
// Constants
"CONSTANT1",
"CONSTANT2",
"CONSTANT3",
"CONSTANT4",
"CONSTANT5",
"CONSTANT6",
// Functions
{ "trigger": "func1", "contents": "func1(${1:integer val})" },
{ "trigger": "func2", "contents": "func2(${1:float val})" },
{ "trigger": "func3", "contents": "func3(${1:integer val1}, ${2:integer val2}, ${3:integer val3}, ${4:integer val4}, ${5:float val5}, ${6:float val6}, ${7:float val7})" }
]
}
scope には、「事前準備」で作成した構文定義ファイルの scopeName に対応する値 (source.構文名) を指定します。後で構文定義をするときに見直します。
completions の小要素として、補完を行うコードを並べます。上から順に、型、単純な制御子、定数、関数と並べてあります。
型は、必ず空白の後に文字が書かれるため、空白を入れてあります。JUMP も同様。
関数の引数は*${n:(引数名称)}*で囲みます。
Snippet ファイル
<snippet>
<content><![CDATA[do
{
${2:code}
}
while ($1);
$0]]></content>
<tabTrigger>do</tabTrigger>
<scope>source.lsl, source.esl</scope>
<description>do … while …</description>
</snippet>
content に で括って補完内容を書きます。
改行・空白・タブなどはそのまま反映されます。
カーソルは、$1, $2, $0 の順に飛びます(常に $0 が最後、あとは昇順)。
プレースホルダに何か文字を表示させたい場合は ${2:code} のように、文字を表示させたくない場合は $1 のように書きます。
tabTrigger には、置換を発動する文字を定義します。
scope は先の説明と同様です。
description には、補完時に右端に表示される説明を書きます。ここを設定しないと、Snippet ファイルの名前が表示されます。