SublimeTextに実績機能をつけた


つけました

##インストール
1. __Package Control__ から __Install Package__ を選択
2. __Achievement__ を選択

##使い方
###実績の解除
適当に使っていると実績が解除され、その旨を伝えるダイヤログが表示される
![スクリーンショット 2013-12-21 3.46.29.png](https://qiita-image-store.s3.amazonaws.com/0/22102/b9004848-3841-8bf2-5b0a-0ba595e24211.png "スクリーンショット 2013-12-21 3.46.29.png")

###解除済み実績の表示
メニューバーの __Sublime Text > Preferences > Package Settings > Achievement > View Achievements__
もしくは
⌘+⇧+,

今のところ解除した実績名しか確認できないので、その説明も見れるようにしたい（どう表示したらよいか悩み中）

##リセット
そのうちリセットコマンドを実装します
今は __/Users/USERNAME/Library/Application Support/Sublime Text 3/Packages/User/__ にある以下のファイルを削除してください

+ __achievement.sublime-settings__
+ __unlocked.sublime-settings__

##プルリクエスト待ってます
まだまだ実績の数が少ないのでプルリクエスト送ってください。[airtoxin/Achievement](https://github.com/airtoxin/Achievement)
！自分で実績を実装してもあまりおもしろくないとか思っているわけじゃないです！
もしくはアイディアだけでもツイッターとかで連絡してくれれば実装しようと頑張ります。

実装済み実績は[ここ](https://dl.dropboxusercontent.com/u/1990306/%E5%AE%9F%E8%A3%85%E6%B8%88%E3%81%BF%E5%AE%9F%E7%B8%BE%E4%B8%80%E8%A6%A7.txt)をみてね（完全にネタバレなので）

##設定周りとか
宣伝だけじゃアレなので作り方でも

sublimeのpackagesディレクトリに新しくディレクトリを作ってそこ以下に作成したパッケージのファイルを置きます。
セッティング関係のファイるはsublime-settingsを拡張子に、
コマンドパレットなどから実行できるコマンドはDefault.sublime-commandsに、
ショートカットキーの設定はDefault.sublime-keymapに、
メニューバーの設定はMain.sublime-menuに
それぞれ書きました。中身はjsonです。
詳しい書き方は[Sublime Text 2 プラグインチュートリアルのまとめ](http://qiita.com/makopo/items/a0ad69dab894ffe22e5d)が参考になりました。あとは他のパッケージのやつとかを参考にするといいと思います。
なぜかセッティング以外のやつはファイル名そのままじゃないと読み込んでもらえませんでした。

あとこれらの設定ファイルはテンプレート的に使われるみたいで、実際にコマンドとかで変更を加えて保存した時はpackagesディレクトリの中のUserディレクトリに保存されるようでした。

##EventListenerとか
デフォルトで幾つか[用意](http://www.sublimetext.com/docs/3/api_reference.html#sublime_plugin.EventListener)されているので、このクラスを継承してそれぞれのメソッドをオーバーライドすればイベントドリブンなコマンドが作れます。
asyncの方を使えばコマンド実行中もsublimeがロックされないので基本こっち使えばいいと思います。

##用意されていないEventListenerについて
上のEventListenerクラスに用意されていない奴（ショートカットキーのイベントとか）は自分でそのコマンドを作った後にsublime-keymapの方にそのショートカットキーをオーバーライドする感じでかけば大丈夫でした。

例えばコピーショートカットのイベントはOverrideCopyCommandってクラスをsublime_pluginのTextCommandクラスを継承して作って、そこのrunメソッドでまず`self.view.run_command("copy")`を実行します（runメソッドはそのコマンドが呼ばれた時に実行される）。これで無事コピーが実行されるので、その後で実行したい挙動をかけば好きなショートカットキーにイベントを追加できます。
デフォルトのショートカットキーはsublimeの Preferences > Key Bindings - Default にあるのでここで検索するといいと思います。

非同期の処理にしたい場合はthreadingをimportして

```
thread = threading.Thread(target=self._command_thread)
thread.setDaemon(True)
thread.start()
```
みたいに書いて_command_threadメソッドに処理をかけば非同期になります。

これでコマンドが作成できたのであとはDefault.sublime-keymapのファイルに

```
[
	{ "keys": ["super+c"], "command": "override_copy" }
]
```

こんなかんじに追加すればショートカットキーのオーバーライドができます。

##api
sublimeのapiは[ここ](http://www.sublimetext.com/docs/3/api_reference.html#sublime.Settings)とにらめっこしました。

##Package Controlに登録
[Package Control Channel](https://github.com/wbond/package_control_channel)をフォークしてrepositoryディレクトリ中のjsonファイルを編集してプルリクエストを送る。
しばらくすると自動テストが実行されて、その結果がプルリクエストの画面に表示されます。問題なければ緑色のバーが出てマージ待ちになります（私の場合は数時間でマージされました）
jsonのファイルは名前ごとに分かれているので自分のパッケージ名の所に追記しましょう。jsonの中身もパッケージ名が名前順に並んでないと自動テストで弾かれます。

中身はこんなかんじで、

```js
{
	"name": "Achievement",
	"details": "https://github.com/airtoxin/Achievement",
	"releases": 
	[
		{
			"sublime_text": ">2999",
			"details": "https://github.com/airtoxin/Achievement/tags"
		}
	]
}
```

sublime_textが対応sublimeのバージョン
releasesのdetailsがパッケージのバージョンです。こっちのバージョンはgitのタグで管理するみたいです。

無事マスターにマージされれば[Package Control](https://sublime.wbond.net/)にて確認できると思います。