もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

Yet Another 実行中のmikutterにコードを流し込むやつを作ったよ

何これ?

明けましておめでとうございます。

これは「あー正月ってテレビもつまんないしマジすることないよねー」カレンダー (なにそれ?)1日目の記事です。(1年ぶり2記事目)


今回は「起動中のmikutterに外部から任意のコードを流し込むプラグイン&コマンド」を作ったのでその紹介をば。

これ、コンセプトは@toshi_aさんのmikutter-modeと同じで、プラグインを改造するたびにmikutterをいちいち再起動したくないよねと言うところです。

じゃあなんで再発明してんだよ溜まってるIssue処理しろよ最近お前の腹の出方ヤバイだろ痩せろよ?のかと言うと、

もぐのがMacDBusを動かせなかった

mikutter-modeがプロセス間通信に使っているLinux御用達フレームワークDBusが、もぐののMacではなんかエラーになるんですよね。
なので、今回は古のRuby標準ライブラリであるdrubyでプロセス間通信を実現しました。

もぐのがvim

mikutter-modeはEmacsLISPで実装されてる所がいっぱいあって、vimで使うにあたってよくわかんなかったので。
せっかくなので、エディタに依存しない仕組みにすることにしました。

(ちなみにmikutter-modeのvim移植は2GMonさんによる実装があったりします。)
github.com

インストール

GitHubからzipファイルをダウンロードして、プラグインディレクトリにmikutter-code-injectorと言うディレクトリ名で展開して下さい。

moguno/mikutter-code-injector · GitHub

※mikutterプラグインマネージャ"Packaged"で"moguno"を検索してインストールするのもおすすめです。

使い方

普通にmikutterを起動する。

ごく普通にmikutterを起動してください。

見た目には変化はありませんが、netstat -aするとこんな行が増えてたりします。

tcp6       0      0  localhost.39311        *.*                    LISTEN

コードを送り込む

~/.mikutter/plugin/mikutter-code-injector/にmktrと言うコマンドがあります。
そのmktrの標準入力にRubyコードを流し込んでみてください。
起動中のmikutterでコードが実行されます。

実行できるコードに制限はなく、mikutterのフル機能を操作できます。

仕組み的にはmikutterのトップレベルbindingをdrubyで公開しておいて、mktr側でそれを取得。
んで、取得したbindingのevalを呼ぶとmikutter側でコードが実行されると言う寸法です。

それでは試しに、コマンドラインからつぶやいてみましょう。

echo 'Service.primary.post(:message => "みくっ")' | ./mktr

f:id:moguno:20151121103409p:plain

ちゃんとつぶやけましたね。
速攻で複数人からふぁぼられてるのは弊TLの仕様です。

vimから使ってみる。

もぐのはvimスクリプトが書けない人なので、mikutter-modeの様なvimとの統合機能は作り込んでません。
て言うか、vimではこんな風に現在のバッファをmktrの標準入力に流し込むことが出来るので、これでいっかーな感じになってます。

:w !./mktr

これで本格的なプラグイン開発にも対応できますね。

f:id:moguno:20151121111310p:plain

現状の制限として、mikutter起動時のイベントon_bootはコード流し込み時には実行されません。
この辺はなにか工夫できたらいいなと思ってます。