もぐてっく

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

textbringer APIメモ

カーソルを動かす

Buffer::goto_line(行)
Buffer::goto_char(列)

goto_char()に1行の文字数以上の値を渡しても、次の行には行かない。

モードラインをナウくする

Face.define(:mode_line, foreground: "blue", background: "#FFFF00", bold: true, reverse: false)

f:id:moguno:20170411233334p:plain

foreground、backgroundにはこの他にCurses::COLOR_BLUEとかColorオブジェクトのインスタンスも渡せるっぽい。

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}")
    }
  }
}

下の画像の通り、ミニバッファが時を刻み始めました。
非同期処理なのでキーボード入力など他の操作を阻害することもありません。いい感じです。

f:id:moguno:20170411015126p:plain

おまけ

next_tick()はわかったけど、お前の1tickってなんぼやねん?
=>実測してみましたが、1msっぽいです。

日本発のRuby製テキストエディタ!その名もtextbringer!のマクロを書いてみる

shugo.net

日本発の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

マクロを書く

~/.textbringer.rbってファイルが起動時に実行されるので、それにRubyコードを書いて行きます。

vi ~/.textbringer.rb 

注:当方vim

APIを探っていく

マニュアル類はなさげなので、ソースコード(lib/textbringer)を読み解いていきます。

バッファに文字列を挿入する

Buffer.current.insert("test")

最下段(ミニバッファ)に文字列を表示する

Utils::message("moguno")

f:id:moguno:20170408180732p:plain

コマンドを定義する

define_command(:test) {
  insert("test")
}

と書くと、

M-x test

で、バッファに"test"って文字列が挿入されます。
(M-xはEmacs語で「ESCキーを押して離してxキーを押す」ってことらしいです。)

このコマンドの書式。mikutterのcommand DSLに似てますね・・・あっ!

mikutterプラグインを動かしてみる

mikutter。知る人ぞ知るTwitterクライアントですね。

mikutter

プラグインRubyでお手軽に作れるので、なんか変なプラグインがゴロゴロしてるのが特徴です。

と言うことで、mikutterプラグインが使っているPlugin、Message、User、Serviceあたりのクラスをでっち上げて、mikutterのコピペ投稿プラグインを動かしてみました。
思ったよりもあっさり完動。

f:id:moguno:20170409012927p:plain

テキストエディタでヨドバシプラグインを動かす理由はこれから見出すとして、ルール無用でなんでもできちゃうところが、Ruby製プロダクトの魅力ですね。

まとめ

Emacsライクな動きがvim派にはキツイですが、「環境」と呼んで差し支えない大きな拡張性が魅力的です。
今後も触って行きたいと思います。