ページ

2013/01/22

[SublimeText2]スニペットを作成する

SublimeText2のスニペットが使いたくなったので設定もそこそこに作成してみた。
参考: Sublime Text 2で自分用のスニペットを作る方法 | prime factor

Tools > New Snippet.. からでも作れるし(デフォルトで入力されているけど)、
普通に新規ファイル作成でも作ることができる。

構造

snippet: 以下の要素を入れる親要素。
content: スニペット展開後の内容。リテラルとしての $ は \$ にエスケープする必要がある。
tabTrigger: スニペットを呼び出す際の名前。
scope: よくわからないけど source.python と書いてあると python のソース内で有効になるらしい。
Scopes - Syntax Definitions — Sublime Text Unofficial Documentationによると
TextMate の Scope Selector をインスパイアしているらしい。
TextMate Manual » Scope Selectorsを読めば何かわかるかもしれない。
description: 入力補完リストに表示される説明。
<snippet>
    <content><![CDATA[]]></content>
    <tabTrigger></tabTrigger>
    <scope></scope>
    <description></description>
</snippet>
ちなみにスニペットにインデントを含む場合は常にタブを使えって書かれている。
タブなら設定の translateTabsToSpaces が true なら自動的にスペースに変換してくれるらしい。
が、自分はインデントはスペース派で、スニペットを誰かと共有する予定もないので無視してスペースで書いた。

拡張子

.sublime-snippetをつけて保存する。

保存場所

[Sublime Text 2]/Packages以下ならどこでもいいようだ。
わかりやすく [Sublime Text 2]/Packages/User の中に Snippets フォルダを作って
言語ごとにフォルダ作って管理しておくといいかもしれない。

[競技プログラミング][PHP][AtCoder]鉛筆リサイクルの新技術で作ってたスニペットを晒すとこんな感じ。
<snippet>
    <content><![CDATA[
function println(\$var, \$line = null){
    if(is_null(\$line)){
        echo \$var . PHP_EOL;
    }else{
        echo \$line . ':' . \$var . PHP_EOL;
    }
}
]]></content>
    <tabTrigger>f_println</tabTrigger>
    <scope>source.php</scope>
    <description>競技プログラミング用出力関数</description>
</snippet>
これでPHPのソース内で f_println を入力してタブを押すだけでこの関数が展開される。すごく便利。

少し不満な点はコードを選択して右クリックメニューとかショートカットキーとかで
シームレスにスニペットを作成できない点。(まだ使い始めで知らないだけかもしれないが…。)

スニペットのフォーマットを覚えるのが嫌だったので
スニペットのテンプレートを展開するスニペットを作ろうとしたけど展開しても空文字になって挫折した。
上の不満点もあるし、プラグインを作ってみたい。