mikutterの最新の情報は、mikutter blogに引っ越しました。

2014年12月13日土曜日

mikutter-mode

<< 12日目 mikutterアドベントカレンダー2015 14日目 >>
こんにちは。ネタができたので書こうと思います。本日はmikutter-modeのある開発環境についてです。

mikutter-modeとは
Emacsでmikutter開発/mikutterプラグイン開発をするためのelispです。あ、elispっていうのはEmacs Lispで書かれた、あっ Emacs Lispというのは…

Emacsでないと意味のない内容なのか
そうではありません。例えばVimmerと呼ばれる人々は、Emacsでできることを大抵Vim上で実現してしまう習性を持っています。こういった記事をたまに書くことで、他のエディタ/IDEからやばいプラグインが生えてくるのは珍しいことではありません。

過去に触れている記事
実はmikutterの薄い本vol.2 の私の記事「プラグイン開発のベストプラクティス」 にて、
これについては触れています。
ただ、この記事は2012年夏に公開されたもので、その後の変化についてはとくに触れられていないので、あれからやったことを中心に書いていきます。

インストール
このあたりは特に変わってないのでざっと。

Emacs
まず、 mikutter-mode をチェックアウトして、elispよろしく ~/.emacs.d/ 以下とかそういうところに設置します。
Emacs側からは、この中の mikutter.el をロードするようにしましょう。
一応、私はこんな感じのことを書いてます。
変数 mikutter:dir には、mikutter.rbが入っているディレクトリを指定しましょうね。 e2wmを使っている場合、おまけでついてくる mikutter-parsepective を使うと、以下のような画面になって良い感じです。
mikutter
mikutter-modeの plugin/ 以下に、 mikutter_mode というディレクトリがあります。これがEmacsと連携するためのmikutter側のプラグインです。こちらも、このディレクトリを ~/.mikutter/plugin/ に設置します。

mikutterを起動
関数 mikutter-mode を実行すると、mikutterがデバッグモードで起動します。普通にコマンドとかから起動するのと違って、バッファ *mikutter-log* から、デバッグ出力が参照できます。

コード実行
ここからはmikutter-modeを導入しているmikutterなら、Emacsから起動されたものでなくても良いです。
mikutter-modeがインストールされている状態で、mikutterプラグインのソースを開いて C-c C-c と入力すると、mikutterに今表示している内容でプラグインがインストールされます。
mikutterで Alt+xを押してコンソールを開き、そこにプラグインをコピペして実行、という方法を取っている人もいるかと思いますが、 mikutter-mode を使った場合、Emacsからすぐに実行できることに加え、実行前にプラグインをmikutterから除去してくれるので、イベントハンドラが無限増殖しないといったメリットがあります。

選択範囲のコードを実行
mikutterのコードを開いている時に、コードの一部をリージョンで囲い(文字を選択)、 C-c C-c を押すと、バッファ全体ではなく選択したコードがmikutterで実行されます。もちろんこの場合はプラグインが一度除去されるようなことはありません。
なお、C-c C-c と、 C-c C-e で実行されたRubyコードの実行結果は、 *mikutter-result* に出力されます。mikutter-parsepective ならめっちゃ便利。

Emacs上のmikutter console
mikutterコンソールはmikutterの標準機能で、起動中のmikutter内でRubyのコードが実行できるので便利です。mikutter-modeも同様の機能を提供しています。Emacs側で関数 mikutter-console を実行すると、 *mikutter-console* というバッファが開いてきます。
これはただのmikutter-modeのバッファなので、前述のコード実行のキーが使えます。
用途としては、標準のコンソールと同じだと思います。ただし、こちらの場合はEmacsやruby-modeが提供するシンタックスハイライトや補完機能が使えるので、できるだけこちらを使ったほうが良いと思います。

プラグインが動く最小構成のmikutterを作る
これはついさっきやったアップデートです。
mikutterは、ツイートの取得でさえプラグインで実装されているということはご存知のとおりです。
プラグインというのは、入れることも外すことも自在にできるものです。標準プラグインだって外すことができます。
このことが何に使えるかというと、mikutterプラグインを開発する時に、不要なプラグインを取った環境を構築して、そこでプラグインを開発するということが可能になります。起動も早いしそのプラグインだけに集中できるのです。

これを手動でやると従来は大変でした
  • mikutterのディレクトリをコピー
  • いらないプラグインを消す
  • ./mikutter.rb --confroot=適当なディレクトリ でmikutterを別プロファイルで起動
 mikutterの --plugin オプションを使うとプラグインを消す必要がなくなって、例えば以下のようにすると home_timeline と rest プラグインだけがロードされた環境で起動できます。home_timeline は gui と gtk と uitranslator に依存しているので、この指定だけでバッチリ適切な言語でGUIが表示されます。

$ mikutter.rb --plugin=rest,home_timeline

これで確かに起動はするのですが、次普通にmikutterを起動すると、タブやペインの構成がぐっちゃぐちゃになっていると思います。一度消えたタブをまた追加したからですね。他にも設定を破壊する可能性がいろいろあるので、先のconfrootを使って、設定を分けておく必要があります。

となると、結局かなり面倒になってきます。ちょっとプラグインをデバッグするために毎回こんなことをしようと思う人はいません。最近Twitterでヌマクローをよく見かけますけど、この記事書いてて、この話をされた人の顔によく似ていることに気づきました。どんな相手でもこの話をしてからパワーウィップで確1で倒せると思います。

自分がヌマクローにならないようにするにはどうすればいいでしょうか。そう、mikutter-modeを使うのです。適当なmikutterプラグインを開いて C-c C-e と入力すると、mikutterが起動します。このmikutterには、以下のプラグインしかインストールされていません。
  • mikutter-mode
  • カレントバッファのプラグイン(現在開いているプラグイン)
  • そのプラグインが依存している全てのプラグイン(.mikutter.yml に書かれてるやつ)
プラグインによっては、gtkプラグインに依存していないものもあります。この場合、UIが表示されません。gtkプラグインがロードされなかったからです。このような状況でも、Emacsからmikutter上でコードを実行することができるし、出力も見れるのでデバッグが可能です。むしろ、プラグインを検証するときには、不要なGUIが上がってこないのでとても早く行うことができます。
先ほどの設定が壊れる問題については、 /tmp/mikutter-(プラグインスラッグ) / というディレクトリがなければ作られ、その中に ~/.mikutter が自動的にコピーされます。普段使用している環境を壊すことなく再設定の手間を省いています。

まとめ
mikutter-mode に前からやりたかったことをやってみました。
「コードの実行」は、evalのある言語ならではです。これがmikutterのアドバンテージの一つと言っても過言ではありません。
最後の「プラグインが動く最小構成のmikutterを作る」は、流石に最後は全部のプラグインを入れた状態でテストしたほうが良いですが、途中のテストはある程度これでできそうなので、どんどん使っていきたいです。

mikutter-modeは他にもいくつか機能があります。知らなかった人は導入を検討してみましょう。