2ペインテキストビューア、いろいろ作ってます。

20年くらい前にOS/2eff , 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 ではよくあるのですわ…)

f:id:zetamatta:20191002210300p:plain

実装例2: Subversion のビューア

こちらはソースだけ。 なぜなら、スクリーンショットが業務情報のカタマリのやつしかないから…。

git と違って git show みたいなやつはないんですが、svn log --xml でそこそこ情報が取れるので、詳細情報はログ全部+変更ファイル一覧みたいなものをかわりに載せてます。

実装例3:twitter client(tmt view

いわゆる「人間性はありません」(tmt.exe)という名前の謎ツイッタークライアントが正体がコレです。もともと tmt post で投稿、tmt timeline でタイムラインを標準出力に出すといった twtyパクったようなインスパイアした ツールなんですが(だから自分の趣味のサブコマンドしかない)、これに tmt view というビューアを起動するサブコマンドを追加しています。

f:id:zetamatta:20191002210459p:plain

twitter は文字種が多いので、go-twopane のすごい耐久テストができました。ANSI エスケープシーケンスだけでやっているので、うっかりすると行の桁数が想定よりオーバーフローして、画面がくずれてしまいます。なので、以下のような対策を go-twopane 側でとっています。

  • Windows の端末はサロゲートペアな Unicode が表示できないので、それらは &#xNNNN; といった形にエンコードする(豆腐にしてもよかったんですけどね)
  • 文字幅があいまい(全角か半角かというやつです)とされている文字については、あふれないように端末のマスを常に2セル消費することを前提にしてしまう

(注意)

tmt はソースそのままではビルドできません。twitter の ConsumerKey , ConsumerSecretKey がカラだからです。これらは twitter に開発申請を出してゲットしてから、secret/secret.go.sample にある変数名を埋めないといけません(埋めたあとファイル名から .sample を除くのも忘れないように)

なお、バイナリについては、リリースタブのところからダウンロードできます

利用技術

うむ、また mattn 先生のライブラリにおんぶにだっこだな! でも、この組み合わせだと、Windows/Linux 両方サポートが簡単なんだよ

痛い話など

  • 最初レポジトリを作った時、twopain と命名していました。これは痛い…

  • マインクラフトばっかりやってて GitHub の砂漠化が進んでいましたが、こいつを作るようになって、ちょっと緑が回復しました。

  • ブラウザで見るより twitter 目立たないかなーと思ってたんですが、黒いコンソールの中に日本語がみっちり入ってると意外と目立ちますね(おまえは何を懸念しているんだ

以上です