読者です 読者をやめる 読者になる 読者になる

標高+1m

Make, Hack, Think

NetHackのメッセージをtwitterに流したかった

roguelike emacs

Yecch! This stuff tastes like poison. (But in fact it was mildly stale slime mold juice.)

Nethack->emacs->twitter

NetHack楽しいよね!
twitterも楽しいよね!
Nethackのメッセージをtwitterに流したいよね!

さて、実はLinuxのことよく知らないのでttyの文字列取る方法がわからなかったのです。
Emacsでターミナル動かしてやれば出来そうよね。でもEmacsもよくしらないの。(矢印キーポチポチ
試行錯誤の過程が楽しかったから書いておきます。

続きを見てね

Emacsでシェル使うにはいくつか方法があるようです。M-x shellとかM-x termとか。
Nethackは制御ttyがないとだめなので、M-x termを使います。プロンプトが出たら予めインストールしておいたnethackを起動しましょう。
Emacsのバッファにアクセスするのでemacs lispを書きます。
M-x termすると、*terminal*というバッファが開かれるので、elispには(set-buffer "*terminal*")って書いておきます。何度も回すのでwith-なんちゃらよりset-bufferのほうがよさげ。
Nethackでは、画面最上部にメッセージが出るので、(goto-char pt)とか(goto-line n)とか(line-biggining-position)とかの便利なマクロや関数を使ってバッファの1行目を取得することにします。
最初に書いたのは、(buffer-modified-tick)っていうバッファの未保存の変更回数をチェックしつつひたすら回りつづけるものだったのですが、円環の理に導かれてフリーズ→pkill emacs
Emacsってシングルスレッドなんだそうです。(sleep-for 1)とか入れても他のバッファに制御移せたりしないみたい。
どうしたもんか考えあぐねてgoogling aroundしてたら(start-process)を使うといいよとかって書いてあったので試してみることに。

(start-process "nethack-p" "*Messages*" "/bin/bash" "nethack")
Terminal must backspace.

Process nethack-p exited abnormally with code 1

制御端末が必要なんでしたね…
sshで-tオプションをつけてやるとなんか作ってくれるらしいです。sshもよくしらない;;
(start-process "nethack-p" "*Messages*" "ssh" "-t" "-l" "ympbyc" "localhost" "nethack")
Terminal must backspace.
Connection to localhost closed.

Process nethack-p exited abnormally with code 1

だめじゃん><
このとき既に午前五時を回っており、頭も働いていなかったので惰性で色々試してたのです。
ダメだったので一度寝て、昼頃起きて再チャレンジ。

キーダウンとかマウスクリックとかのイベントを補足する仕組みがあればいいのになー。
なさそうだよなーと思い込んでいたのですが、普通にありました。とりあえず(local-set-key)が使えたのでそのまま使ってますが、全バッファで有効になるのでスマートじゃないかも。
Nethackってほとんどのキーにコマンドが割り当てられているので、マウスでいいやーと、左ダブルクリックにイベントリスナを登録してみました。(local-set-key)で指定したコールバック関数での(interactive)っていうのが肝らしいんですが、コピペしただけなのでよく分かりません。

これでNethackで遊びながら好きな時にダブルクリックすればスクリプトにメッセージが届くようになりました。
twitterへの投稿は、elispでも実装があるはずですが、探すのも面倒くさいので前から使ってるシェルコマンドを(call-process)で呼ぶことにします。これは同期処理になるのでラグが出ますが、気にならない程度だし、(delete-process)する手間も省けるからこれでいいよね。いえいっ!完成!

たった13行のスクリプトの説明を長々と書いたわけだけど、書くのを楽しんでるので別にいいわよね。
elispを書くのは今回が初めてでした。「Emacsは環境」っていうのがちょっとだけわかった気がします。