Help us understand the problem. What is going on with this article?

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 ファイルの名前が表示されます。

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

選択すると...
補完後

makopo
StackOverflowや製品のフォーラム・Issueにはあるけど、日本語での情報が充実していないものを中心に載っけています。興味とお仕事の事情に応じて投稿技術の傾向が変わりますので、フォローされる方はご留意ください。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away