もぐてっく

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

日本発の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派にはキツイですが、「環境」と呼んで差し支えない大きな拡張性が魅力的です。
今後も触って行きたいと思います。

mikutter3.5のUserMixinでユーザーアイコンにスキンの画像を使いたいとき

UserMixinを混ぜ込んだ自作のユーザーモデルのアイコンを、みくったーちゃん(スキンのicon.png)にしたい場合です。

  • UserMixinは自身のprofile_image_urlフィールドをキーにして、Photo::PhotoからPixbufを得ている。なので、ユーザーモデルのprofile_image_urlにアイコン画像のURLを入れておけば良い。
  • みくったーちゃんスキン画像のURLはSkin["icon.png"].uri.pathで得られる(※)。

※Photo::Photoは"file://hoge/fuga.png"みたいなfile://スキームのURLが解釈できない(バグ?)ので、URI::path()を使って/から始まるUNIXパス形式で渡してやる必要がありました。ってこれまたWindowsでハマるパターンじゃん。。。


コード的にはこんな感じになります。

user = DashButtonUser.new_ifnecessary({
  :uri => URI.parse("dashbutton://singleton"),
  :name => "Amazon Dash Button",
  :idname => "Dashボタン",
  :profile_image_url => Skin["icon.png"].uri.path
})

たった1行!シェルスクリプトからAmazon Dash Buttonを使う

tcpdumpコマンドを使ってAmazon Dash Buttonのボタン押下を検出する仕組みを編み出しました。

どうやんの?

tcpdump arp and ether src ac:63:be:ba:09:4b -c 1

 arp    :ARPパケット
 and    :かつ
 ether src ac:63:be:ba:09:4b:発信元MACアドレスがDash ButtonのMACアドレス
 -c 1 :該当するパケットを1回検出したらtcpdumpを終了する。

Dash Buttonを押すとtcpdumpが上記のパケットを検知して終了するので、その後にお望みの処理をするシェルスクリプトを書く感じです。

#! /bin/sh

while true ;do
	ssh -i $2 root@localhost tcpdump arp and ether src $1 -c 1 > /dev/null 2>&1
	echo "ボタンが押されました"
done

Linuxとかでtcpdumpを動かすにはroot権限が必要です。
今回は普通のユーザーから使いたかったので、sshの公開鍵認証でパスワードなしにrootに昇格させることにしています。

おまけ:Dash ButtonのMACアドレスを調べる

moguno@dashbutton:~$ sudo tcpdump -e arp -c 1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

(Dash Buttonを押す)

09:11:06.876606 ac:63:be:ba:09:4b (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 60: Request who-has 192.168.11.1 tell 192.168.11.13, length 46

ac:63:be:ba:09:4bがMACアドレスです。