概要
- Python で書く必要がある
 - 実体は sublime_plugin.TextCommand のサブクラスで、このクラス 1 つが 1 コマンドに対応
 - 実行時はこのクラスのインスタンスが作られ run メソッドが呼ばれるので、処理をここに書く
 - コマンド名はクラス名から Command をのぞき snake case にしたもの、FooBarCommand なら foo_bar になる
 - Command Palette に表示する方法は後述
 - Snippet はまた全然別の仕組み
 
作り方
[Tools]-[New Plugin...] とするとひな形ができるので、Packages/User 下 (など) に保存する。拡張子は py でよい。
使い方
- Console を開いて ([View]-[Show Console]) 
view.run_command("コマンド名") - キーバインドする ([Sublime Text 2]-[Preferences]-[Key Binding (User)])
 - Command Palette から使う (後述の方法で登録して [Tools]-[Command Palette...])
 
ドキュメント
ここにも書いてあるけど、Packages/Default 内にサンプルがいくつかある。
イディオム
self.view に対して処理することが多い。
# 開いてる view を取得
self.view
# OK / キャンセルダイアログ
if not sublime.ok_cancel_diag(u'処理を続行しますか?')
  return
# 開いてるファイルのパスを取得
self.view.file_name()
# 開いてるプロジェクトのパスを取得
self.view.window().folders()[0]
# ファイルを開く
self.view.window().open_file("foo.rb")
# ファイルの内容をすべて取得
region_all = sublime.Region(0, self.view.size())
self.view.substr(region_all)
# ファイルの内容をすべて置き換え
self.view.replace(edit, region_all, "bar")
# ファイルの存在チェックとかは普通に Python のライブラリを呼べば良い
import os
os.path.exists("foo.rb")
# シェルなんかも Python のライブラリで
# rbenv で ruby 呼ぶ場合、環境変数渡すかフルパスにしないといけない
import subprocess
subprocess.Popen(["ruby", "-v"], stdout = subprocess.PIPE).communicate()[0]
Command Palette に表示する
コマンドを作っただけでは、Command Palette には表示されない (run_command やキーバインドで使うことはできる)。
下記の様なファイルを Packages/User/User.sublime-commands という名前 (拡張子重要) で保存すれば、Command Palette に表示されるようになる。
[
  // caption は Command Palette に表示される文字列
  // command はコマンド名
  { "caption": "Foo Bar", "command": "foo_bar" },
  { "caption": "Baz", "command": "baz" }
]