概要
- 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" }
]