goのTUIについて2020年最終版

Posted on:

概要

goのTUIについての2020年の最終更新版です。

goでTUI(text user interface)を作成する場合にライブラリを使用するのが一般的です。

goのTUIライブラリはだいたい以下に分類されます。

goのTUIライブラリはtermbox-go系、tcell系の利用が多かったですが、彗星のごとくbubbleteaが登場しました。

bubbleteaThe Elm Architectureに基づいて作られているというフレームワークで、追加のコンポーネントとしてbubblesもあり、もう一つの系統として選択肢になると思います。

TUIライブラリを謳っている場合は、だいたい上記3つを元に実装されている場合が多いです。

TUIはエスケープシーケンスを使用すれば、ライブラリを使用しなくても実現できますが、端末によりエスケープシーケンスが変わっていたりするので、マルチプラットフォームで動作するのは難しくなります。 そのため、独自に一から作成するよりは、これらのライブラリの上に便利な機能を足す形になります。

termbox-go系

termbox-goは、老舗で現在も多く使われていますが、開発は停滞傾向で、termbox-goにもそれほど保守しない方向だと書かれています。

termbox-goを使用して、より高度なウィジットを実装したライブラリにgocuiがあります。

tcell系

tcellは、termbox-goよりも新しくtermbox-goを意識して開発され、今も開発も続いています。 tcellは基本的な機能しか提供しませんが、tcell/viewsには、少し高度なウィジットがあります。

また、より高度なウィジットを実装したライブラリとしてtviewがあり、よく使用されています。また、そこからForkしたcviewも候補に入れておくと良いかも知れません。

さらに元々termbox-goを使用していたgocuiをtcellに変更したawesome-gocui/gocuiも開発されています。

bubbletea系

端末全部を使用するモードしかないtermbox-goとtcellと違い彗星のごとく現われたbubbleteaは現在のプロンプトから対話するような、ちょっとしたプログラムから端末全部を使用するTUIまでサポートしています。

既にが豊富に用意されていて、十分に実用に耐えるように思います。

その他

termbox-goやtcellは、端末画面をまるまる使用することを前提に作られています。起動すると現在の端末画面は消えて(終了時に戻すことは可能)、新しい画面が表示されます。

現在のshellプロンプトで動作するような対話型プログラムの場合は、termbox-goやtcellでは作ることはできないので、bubbletea系か別のライブラリや自前で実装することになります。

別のプログラムとしては、対話型のライブラリとして go-promptlinerがあります。

また、コンソール上の表示を助けるツールとして色を付けたり、その行のまま表示を変えるプログレスバー的な表示をするライブラリがあります。

どれを選択すべきか?

2020年12月現在、端末全体を使用する以外の使用の可能性がある場合は、bubbleteaを使用するのが良いと思います。端末全体を使用するアプリケーションを開発するなら、tviewbubbleteaで、例を見ながらどちらを使用するか決めるのが良いでしょう。