Sublime Text 3 で Jupyter カーネルを使ってコード実行、補完 etc...するプラグインを書いている


2017/6/6 更新: Package Control Channel に入れてもらえました! Package Control で Hermes を探してもらえばインストールできます。

タイトルの通りです。

今作っているものの紹介記事です。ちゃんとリリースしたあとで「書いた」として記事を上げる方がカッコいい気もしますが、気分転換したくなってきたので書いちゃいます。こんなもん作ってますよという以上ではないです。GW 中にとりあえず Package Control にサブミット出来るくらいが目標だったのですがなかなかそうもいかず。

とりあえず以下にレポへのリンクとスクショです。

何をするプラグインなの?

Jupyter のプロセスと通信して Sublime Text 上のバッファにあるコードブロックを実行する&補完の情報を取ってきます。図表なんかは Phantom を使って結果表示用のビューの中にそのまま表示します。関数のシグネチャとかも取ってこれるようにしようと考えています。
Atom には Hydrogen というクレイジープラグインがあるのですが、それの自分流移植版てなところです。

そもそも Sublime Text ではエディタ内でのコード実行にSublimREPL というパッケージが合ったわけですが、それのメンテ止まっていたこと(最近再開したようなのですが)が開発の動機だったりします。また、Atom に浮気している時に先述の Hydrogen に出会ってしまったことで、「Jupyter のプロトコル使えば、理想的にはカーネルのあるあらゆる言語でコード実行と補完 etc が出来るプラグイン書けるじゃん!」ということに気付かされ、ちょこちょこと開発作業を開始したのです。

とりあえずはカーネルに接続してコード実行・結果表示・補完の取得とまあ最低限の機能くらいまでは書けたかなあと思ったので、とりあえずこんな記事を書いちゃっています。

何で Jupyter を介するの?

iPython Notebook から名前が変わった Jupyter は今ではいろんな言語を実行することが出来ます。
重要なのは Jupyter のプロトコルを介することでプラグイン側からは同じ操作でコードの実行・補完などの各種情報の取得が出来るようになることです。プラグインから直接インタープリタを叩くとした場合、意外と各インタープリタ(および OS)独特の対応が必要になることがあります。補完なんかも当然言語・インタープリタ依存の処理が必要になります。SublimeREPL が一時メンテ止まっていたのもその辺りの対応に追われているうちに作者がゲンナリしてきたんじゃないかと邪推しています。
でも今は Jupyter カーネルという形で各言語についてそれらを統一的に呼び出せる仕組みが出来ちゃっているので、それに乗っかっちゃおうぜウェーイということです。

Jupyter Notebook 使えばいいじゃん?

Jupyter Notebook はもちろん目的によっては素晴らしいツールです。すぐ終わるようなデータ分析の結果を簡単に共有できますし、よくわかっていないデータやAPIを探索するときには便利ですし、実行可能なチュートリアルを作成するのにも良いでしょう。けれども、私見ですが、コードベースが大きなプロジェクトになってくると Jupyter Notebook ではいろいろ厳しいです。ipynb 形式ではコードの適切なモジュール化が難しくなりますし、編集が必要になったコードにジャンプしたりするのも面倒です。そしてバージョン管理システムとの食い合わせも良くないです。
コードの再利用性と再現性を高めるためには、データ分析の各処理も高機能なエディタで編集してスクリプトとして書いて、人に見せる資料には Rmarkdown や Pweave を使う方が好ましいワークフローに思えます。
確かにデバッグするときとかプロットを作る時とかはインタラクティブな方が楽ちんだったりはしますけどね。

使ってみたい!

などというそんな物好きな方がいるのかどうかわかりませんが、簡単に使い方をば。

インストール

まだ Package Control にはサブミットすらしていませんが GitHub のレポからクローンすれば使えるはずです。メニューからPreferences->Browse Packages...を選択すると開くフォルダで

git clone https://github.com/ngr-t/SublimeHermes Hermes

としてクローンしてください。

(アンインストールしたくなったら単純にフォルダごと消しちゃってください)

もちろん Jupyter が実行に必要なのでインストールしてください。Anaconda を使うのが楽ちんかなと思います。

使い方

  1. Jupyter Notebook を起動してください。
  2. コマンドパレットから Hermes: Set URL コマンドを選んで Jupyter のポートが空いているアドレス&ポートを入力してください。
    • URL のあとでトークンも入力を求められます。設定していなければ空欄のまま Enter を叩いてください。
  3. ビューをカーネルに接続します。
    • カーネルが起動していなければ Hermes: Start Kernel コマンドで起動してください。
    • 起動していれば Hermes: Connect Kernel コマンドで繋いでください。
  4. Hermes: Execute Block コマンドでコードを実行できます。実行されるコードブロックの判定基準は「カーソルを含む行から連続する行のうち、空行あるいはインデントがより少ない行を跨がない範囲」です。

最後に

興味を持った方がおられたら何らかのフィードバックがもらえると嬉しいです。

普段アプリケーション的なものはあまり書かず、ウェブ関連の技術も全然触ってこなかったので、作ってみるとなかなか一筋縄でいかないところが多く新鮮な体験がたくさんありました。
ばっちり実用的なものに仕上げて Sublime Text コミュニティを盛り上げるのにも一役買いたいものです。