Sublime Text 2 言語パッケージ作成：言語設定


[構文定義編](http://qiita.com/items/64531b7372b450a7c3ee)の続き（のつもり）です。Sublime Textとして言語設定ファイル(tmPreferences)の解説をしてあるサイトがほとんど存在しないため、TextMateのマニュアルを参考にしています。

## 事前準備

[構文定義編](http://qiita.com/items/64531b7372b450a7c3ee)と同じく、[AAAPackageDev](https://bitbucket.org/guillermooo/aaapackagedev) をインストールします。構文定義ファイルと同様に、言語設定ファイルも json で書き、後で XML に変換します。

## JSON-tmPreferences の作成
メニューから Tools > Packages > Package Development> New Syntax Definition とアクセスして、ファイルを作成します。エディタにはこのように表示されているはずです。

```
{ "name": "Syntax Name",
  "scopeName": "source.syntax_name",
  "fileTypes": [""],
  "patterns": [
  ],
  "uuid": "d93c1c4c-13e2-4365-94c3-3572ed32afa4"
}
```

ここまでは構文定義ファイルの作り方と同じです。言語設定ファイルにするために、
1. **scopeName** を **scope** に変更します。
2. **fileTypes** と **patterns** の行を消します。
3. **settings** の行を追加します。

```
{ "name": "Syntax Name",
  "scope": "source.syntax_name",
  "settings": {
  },
  "uuid": "d93c1c4c-13e2-4365-94c3-3572ed32afa4"
}
```

このファイルを、「任意の名前.JSON-tmPreferences」という名前で保存します。後の項で **settings** の中身を書いていきます。

## tmPreferences への変換
1. Tools > Build System で Json to tmLanguage を選択します。(メニューに表示されていない場合は、Sublime を再起動します)
2. ```F7``` キーを押します。
3. *.JSON-tmPreferences* ファイルと同じフォルダに*.tmPreferences* が作成されます。

## 設定ファイルで設定できること
* スペルチェック
* インデント定義
* シンボルリストへ表示する条件
* スコープ内だけに適用される変数

[TextMate Manual > Preferences Items 設定アイテム](http://manual.macromates.com/ja/preferences_items.html) に TextMate での記法が解説されています。ただし、「ペアになる文字」は Sublime Text 2 の場合記載不要です。

次の「スペルチェック」の項で tmPreferences の settings の書き方を説明します。その他の項目も書き方が同じなので、settings 以外の部分を割愛して説明します。


## スペルチェック

```*.JSON-tmPreferences
    "settings": {
        "spellChecking": 1
    }, 
```

**name** は何でもよいです。

構文定義ファイルで設定した **scope** で、設定の適用範囲を（例えばコメントの中、リテラル文字列などに）絞り込むことができます。カンマ区切りで２つ以上のスコープを指定できます。

**settings** に *"spellChecking": 1* と書くと、指定したスコープの中の文字がスペルチェックの対象になります。

Sublime Text 2 では、スペルチェックがデフォルトで無効となっています。有効にするには、Preferences -> Settings - User で ```"spell_check": true``` とします。

## インデント定義

詳しい解説は、[TextMate Manual > Appendix - Indentation Rules](http://manual.macromates.com/en/appendix#indentation_rules.html) にあります。

私自身がうまくいっていないので、うまくいくまでここでの解説は控えます。定義しなくてもそこそこインデントしてくれているし。

## シンボルリスト表示定義

```
    "settings": {
        "showInSymbolList": 1, 
        "symbolTransformation": "s/(.+)/\\t - $1/"
    }, 
```

**showInSymbolList** で、 scope にヒットする内容がシンボルリスト (Goto -> Goto Symbol...) に表示されるようになります。

デフォルトではヒットした内容そのものがリストに表示されます。しかし、**symbolTransformation** を使うと、ヒットした内容を加工して表示できます。構文は **s/条件/置換後の文字列/** です。

基本、最初に条件にヒットした文字列だけを置換します。最後に "g" をつけると、条件に合う文字列全てを置換します。

条件の中でカッコ()を使うと、置換後の文字列に $1, $2, ... と指定してカッコ内の文字を参照できます。

上の例では、スコープにあてはまる文字列全体の前に、タブとハイフンをつけています。シンボルリストを表示すると、下のスクリーンショットの２〜４行目のようになります。

![シンボルリスト](https://dl.dropbox.com/s/saqei15fitzmjft/symbol_list.png?token_hash=AAFeRfo8K4sCSe_Jp1Iwd-wLlkBBnH7EjSAeifVyo7fAlw&dl=1)


## スコープ内変数

```
    "settings": {
        "shellVariables": [
            {
                "name": "TM_COMMENT_START", 
                "value": "// "
            },
            {
                "name": "TM_COMMENT_START_2", 
                "value": "/* "
            },
            {
                "name": "TM_COMMENT_END_2", 
                "value": " */"
            }
        ]
    }, 
```

**shellVariables** に定義すると、プラグインのスニペット (.sublime_snippet) がそのスコープを対象に処理を行っている間は、name 変数に value が設定されます。スニペット内では例えば $TM_COMMENT_START のようにして参照できます。スニペットの作り方は[補完定義編](http://qiita.com/items/02e7c4cd8b90288eb767)を参照してください。

TextMate で使えていた TM_COMMENT_START 変数群が Sublime Text でも使えます。TM_COMMENT_START が行コメント、TM_COMMENT_START_2 と TM_COMMENT_END_2 でブロックコメントとして使えます。