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

  • 33
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

言語パッケージは、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 ファイルの名前が表示されます。

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

選択すると...
補完後