20年くらい前にOS/2で eff , ell という「テキストビューア」群を作ってましたが、それと同じような感じのものできないかなーと思って、Go言語で簡単なフレームワーク go-twopane を作ってみました。
- コンソール画面を2分割して、上に件名一覧、下に詳細を表示する
- go-twopane には配列を渡す。配列の要素は「件名」を得る
Title()
メソッドと、「詳細」を得るContents()
というメソッドを定義してあれば OK - カーソル上移動(
↑
,k
)、下移動(↓
,j
)、詳細次ページ(SPACE
)、終了(ESC
,C-q
)程度は標準で実装。他のキーに対するアクションを定義したい場合はコールバック関数を渡せば良い
という感じです。ね、簡単でしょ?
そして、Windows でも Linux でも動きます(ここ重要)
実装例1:git のログビューア (gitview)
件名一覧は git log
の結果。詳細は git show
の結果です。git show
の方は、git の出すカラーを維持し、かつ UTF8 と解釈できない行は ANSI → UTF8 変換を試みるので、文字化けがかなり少ないはずです。(ファイルの中身は ShiftJIS だが、git.exe がファイル名を Unicode で出すので、出力全部の文字コードが一貫しないことが Windows ではよくあるのですわ…)
実装例2: Subversion のビューア
こちらはソースだけ。 なぜなら、スクリーンショットが業務情報のカタマリのやつしかないから…。
git と違って git show
みたいなやつはないんですが、svn log --xml
でそこそこ情報が取れるので、詳細情報はログ全部+変更ファイル一覧みたいなものをかわりに載せてます。
実装例3:twitter client(tmt view)
いわゆる「人間性はありません」(tmt.exe)という名前の謎ツイッタークライアントが正体がコレです。もともと tmt post
で投稿、tmt timeline
でタイムラインを標準出力に出すといった twty をパクったようなインスパイアした ツールなんですが(だから自分の趣味のサブコマンドしかない)、これに tmt view
というビューアを起動するサブコマンドを追加しています。
twitter は文字種が多いので、go-twopane のすごい耐久テストができました。ANSI エスケープシーケンスだけでやっているので、うっかりすると行の桁数が想定よりオーバーフローして、画面がくずれてしまいます。なので、以下のような対策を go-twopane 側でとっています。
- Windows の端末はサロゲートペアな Unicode が表示できないので、それらは
&#xNNNN;
といった形にエンコードする(豆腐にしてもよかったんですけどね) - 文字幅があいまい(全角か半角かというやつです)とされている文字については、あふれないように端末のマスを常に2セル消費することを前提にしてしまう
(注意)
tmt はソースそのままではビルドできません。twitter の ConsumerKey , ConsumerSecretKey がカラだからです。これらは twitter に開発申請を出してゲットしてから、secret/secret.go.sample にある変数名を埋めないといけません(埋めたあとファイル名から .sample
を除くのも忘れないように)
なお、バイナリについては、リリースタブのところからダウンロードできます
利用技術
- キー入力:mattn/go-tty
- 画面出力:mattn/go-colorable
- ツイッター:ChimeraCoder/anaconda
- 直接は使ってないけどツイッターAPIコールとか認証とかのお手本:mattn/twty
うむ、また mattn 先生のライブラリにおんぶにだっこだな! でも、この組み合わせだと、Windows/Linux 両方サポートが簡単なんだよ
痛い話など
最初レポジトリを作った時、twopain と命名していました。これは痛い…
マインクラフトばっかりやってて GitHub の砂漠化が進んでいましたが、こいつを作るようになって、ちょっと緑が回復しました。
ブラウザで見るより twitter 目立たないかなーと思ってたんですが、黒いコンソールの中に日本語がみっちり入ってると意外と目立ちますね(おまえは何を懸念しているんだ)
以上です