Edited at

Sublime Text2 言語パッケージ作成:補完定義

More than 5 years have passed since last update.

言語パッケージは、Tab キーを押したときに残りが表示されるようにするための「補完定義」と、カラーハイライトなどを行うための「構文定義」の2つの側面を定義したものです。まずは、コード補完に関するファイルを作成します。その後で構文定義も作成しますが、長いため別記事に書きます。


事前準備

まずは、仮の構文定義ファイルとして、拡張子が .tmLanguage のファイルをパッケージディレクトリに作成しておきます。


***.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 ファイル


***.sublime-completions

{

"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 ファイル


***.sublime-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<![CDATA[〜]]> で括って補完内容を書きます。

改行・空白・タブなどはそのまま反映されます。

カーソルは、$1, $2, $0 の順に飛びます(常に $0 が最後、あとは昇順)。

プレースホルダに何か文字を表示させたい場合は ${2:code} のように、文字を表示させたくない場合は $1 のように書きます。

tabTrigger には、置換を発動する文字を定義します。

scope は先の説明と同様です。

description には、補完時に右端に表示される説明を書きます。ここを設定しないと、Snippet ファイルの名前が表示されます。

上の例で補完を行うと、このような感じになります。

補完中

選択すると...

補完後