textbringerで時計マクロを書いてみた
textbringerで非同期な処理はどう書けばいいかな?と思って、試しに時計を作ることに。
非同期処理はスレッドを勝手に立てればいいとして、気になるのはオレオレスレッドとUIスレッドとの通信手段です。
GUIツールキットはシングルスレッドを前提に設計されているものも多く、別スレッドから無理に操作をすると、誤動作したりバカよけの例外が発生したりします。
そのため、別のスレッドからUIスレッドに指令を出す「スレッド間通信」が必要になるわけです。
textbringerでは、任意のブロックをUIスレッドで実行してくれるController::next_tick()と言うメソッドが用意されていました。バッチリですね。
(mikutterで言うDelayerですね。)
と、言うわけでこんなコードを書いてみました。
ミニバッファを更新(UI操作)する部分を、next_tick()でUIスレッドにお願いしています。
Thread.new { loop { sleep(0.5) Controller.current.next_tick { message("#{Time.now}") } } }
下の画像の通り、ミニバッファが時を刻み始めました。
非同期処理なのでキーボード入力など他の操作を阻害することもありません。いい感じです。
おまけ
next_tick()はわかったけど、お前の1tickってなんぼやねん?
=>実測してみましたが、1msっぽいです。
日本発のRuby製テキストエディタ!その名もtextbringer!のマクロを書いてみる
Emacsライクな操作性とRubyによる(度の過ぎた)拡張性が今後の大発展を予感させますね。
ちょっと遊んでみたので情報を残しておこうと思います。
GitHubからtextbringerをインストールして起動するまで
gemコマンドでインストールするのが最短ルートですが、ゆくゆくは本体をゴリゴリ触ってみたいのでGithubから持ってきます。
git https://github.com/shugo/textbringer cd textbringer bundle install --path vendor/bundle bundle exec exe/textbringer
APIを探っていく
マニュアル類はなさげなので、ソースコード(lib/textbringer)を読み解いていきます。
バッファに文字列を挿入する
Buffer.current.insert("test")
最下段(ミニバッファ)に文字列を表示する
Utils::message("moguno")