エスケープシーケンス)とよばれる文字列を使うことで、端末上で文字に色を付けたり、文字のフォーマットを変更したり、カーソルを操作することができます。詳細はWikipedia(英語)をご覧ください。いろんな言語でエスケープコードを扱うライブラリが開発されており、Goでも同様のライブラリは存在します。有名なのはmgutz/ansiかfatih/colorでしょう。色を付けるだけならこれらでもいいとは思いますが、以下の点から新たにライブラリを作りました。色やスタイルの指定が文字列ベースでコンパイル時にチェックできない(mgutz/ansi)3ビット(8)色は使えるが、8ビット(256)色が使いにくい。色とスタイル以外のエスケープコードが使えない3つ目に関しては上記のライブラリの範囲外なので仕方ないとしても、2つ目の8ビット色が使いにくいのは残念です。ちなみに、使いにくいというのは8ビット色を0から255の値で指定するということです。Code)というライブラリを作りました。ソースコードはGitHubにあります。aecでは文字の色付けやスタイル変更を含めた多くのエスケープコードをサポートしています。aecの特徴を簡単に紹介します。カーソルの移動や表示・非表示の切替え画面・行に表示されている文字の消去スクロール文字の色付け・スタイル変更RGB(24ビット)から3ビット色や8ビット色への変換エスケープコードを簡単に作成するための構文エスケープコードが動くかどうかは端末環境に依存するので、動かないものも結構あると思いますが、Wikipediaに書いてあって、使いそうなものはほとんどサポートしています。サポートしている具体的なエスケープコードはGitHubやGoDocに書いてあるので、ここではライブラリの設計や使い方を紹介します。ライブラリの設計aecでは一部を除いたすべてのエスケープコードをANSIというインターフェースで表現しています。string}ANSI.Applyでは与えられた文字列にエスケープコードを適用できます。fmt.Stringerをサポートしているので、ANSI.String()によってエスケープコードを取り出すことができます。以下の2つは同じ出力をします。aec.Reset)fmt.Println(ansi.Apply("Hello"))カーソル移動のエスケープコードなどではaec.Resetが不要なので、少しでもパフォーマンスにこだわる場合にはANSI.Applyは使わない方がいいと思います。ANSI.Withではエスケープコードを合成することができます。背景が緑、文字が黒、右に2つ移動するというエスケープコードは以下のように表すことができます。aec.GreenB.With(aec.BlackF).With(aec.Right(2))これを少し簡単に組み立てるための構文(ビルダー)も用意しています。aec.EmptyBuilder.GreenB().BlackF().Right(2).ANSIビルダーを使った方が読みやすいと思います。RGBによる色付けaecではRGB(24ビット)によってより直感的に色の指定を行うことができます。RGBから3ビット色への変換は以下のように行うことができます。マゼンタ・シアン・白のうち最も近い色に変換されます。0)として認識されて黄色になります。同様の方法に8ビット色へも変換することができます。8ビット色はR,G,Bそれぞれを6色とした216色になります。多くの端末ではサポートされていないと思いますが、フルカラーの出力を行うこともできます。100)ちなみに関数名の末尾にあるFとBはForegroundとBackgroundの頭文字で、文字色と背景色を意味します。実践aecを使って実際にプログレスバーを作ってみたいと思います。完成するのは以下のようなものです。1行のプログレスバーであれば\r(キャリッジリターン)を使って書くこともできますが、このような複数行にわたるものであれば、エスケープコードやcursesを使うことになると思います。ソースコードは以下のようになっています。}}up2,col,bar,labelがエスケープコードを表しています。文字色を明るい赤にして、下線を引いて、colと同じ動作をして、カーソルを右に1つ移動するとなっています。その後のfmt.Println()×2はup2を最初に実行するときのために空白を出力しています。for内では、up2によってカーソルを初期位置に移動し、labelでラベルを表示、barでプログレスバーを表示し、0.1秒停止しています。注目してもらいたいのは、builderによって複雑なフォーマットでも簡単に組み立てられるということと、fmt.Print(up2)のように文字列を修飾する必要がない場合には普通の文字のように扱えるということです。これによって簡単にエスケープコードを使うことができます。複雑なエスケープコードを組み立てる方法やRGBによる色指定など、既存のライブラリよりは便利なものになったと思います。私の環境では動作確認ができないエスケープコードもあるので、何かおかしいところがあったら教えてください。