
.NET エコシステムにおいて、コンソールプログラムは比較的劣った表現力しか持ちません。通常、このようなプロジェクトはデモやサンプルとして使用されることが多いです。もうコンソールアプリケーションが本来持つべき価値を認める時が来ました。
端末技術の進化により、ユーザー体験を向上させるルネサンスが始まっています。ITerm2、Hyper、Windows Terminal、これらのツールはどれも単調なコンソール体験に彩りを加えています。これらのツールはユーザーが各自の体験をカスタマイズできるようにしていますが、開発者としてはコンソールアプリケーションにプログラム的なスタイルを加えたいと考えています。
このブログ記事では、いくつかの優れたオープンソースプロジェクトを使ってコンソールプログラムに彩りを加える方法を一緒に見ていきます。ここで紹介する順番はプロジェクトの優劣を示すものではなく、いずれもコンソールプログラムの体験を向上させる素晴らしいソリューションです。
1. Colorful.Console
Colorful.Consoleは、コンソールに出力するテキストのスタイルをより細かく制御できるNuGetパッケージです。System.Drawing.Colorで定義された色を使って、コンソールプログラムの配色を定義できます。
using System;
using System.Drawing;
using Console = Colorful.Console;
...
...
Console.WriteLine("console in pink", Color.Pink);
Console.WriteLine("console in default");

さらに、Colorful.ConsoleではFIGletフォントを使って色付きのASCIIアートを出力することもできます。
- FIGLet: http://www.figlet.org/
FigletFont font = FigletFont.Load("chunky.flf");
Figlet figlet = new Figlet(font);
Console.WriteLine(figlet.ToAscii("Belvedere"), ColorTranslator.FromHtml("#8AFFEF"));
Console.WriteLine(figlet.ToAscii("ice"), ColorTranslator.FromHtml("#FAD6FF"));
Console.WriteLine(figlet.ToAscii("cream."), ColorTranslator.FromHtml("#B8DBFF"));
この出力結果はまさにハッカーの夢のようなものです。

Colorful.Consoleの公式サイトを訪れて、このライブラリが実現できるあらゆるエフェクトを確認し、コンソールプログラムの体験をさらに向上させることをお勧めします。
- Colorful.Console: http://colorfulconsole.com/
2. ConsoleTables
ConsoleTablesパッケージは私(作者)自身が書いたもので、少し厚かましいかもしれません。このライブラリを使うと、開発者はオブジェクトのセットをコンソール上で簡単にテーブル形式で表示できます。
static void Main(String[] args)
{
var table = new ConsoleTable("one", "two", "three");
table.AddRow(1, 2, 3)
.AddRow("this line should be longer", "yes it is", "oh");
table.Write();
Console.WriteLine();
var rows = Enumerable.Repeat(new Something(), 10);
ConsoleTable
.From<Something>(rows)
.Configure(o => o.NumberAlignment = Alignment.Right)
.Write(Format.Alternative);
Console.ReadKey();
}
これまで、誰もがコンソールにテーブルを出力したいと思ったことがあるのではないでしょうか?
FORMAT: Default:
--------------------------------------------------
| one | two | three |
--------------------------------------------------
| 1 | 2 | 3 |
--------------------------------------------------
| this line should be longer | yes it is | oh |
--------------------------------------------------
Count: 2
FORMAT: Alternative:
+----------------------------+-----------+-------+
| one | two | three |
+----------------------------+-----------+-------+
| 1 | 2 | 3 |
+----------------------------+-----------+-------+
| this line should be longer | yes it is | oh |
+----------------------------+-----------+-------+
ConsoleTablesのリリース以降、多くの開発者が独自のコンソールテーブルライブラリを開発しています。中にはさらに優れたものもありますので、自分で探してみてください。
3. ShellProgressBar
他のアプリケーションと同様に、コンソールプログラムも長時間のタスクを実行することがあります。ShellProgressBarは非常に優れたライブラリで、これを使うとコンソールに驚くほど洗練されたプログレスバーを表示できます。さらに、ShellProgressBarはプログレスバーのネストもサポートしています。例えば、以下のGIFアニメーションのような効果です。

ShellProgressBarの使い方は非常に簡単です。
const int totalTicks = 10;
var options = new ProgressBarOptions
{
ProgressCharacter = '─',
ProgressBarOnBottom = true
};
using (var pbar = new ProgressBar(totalTicks, "Initial message", options))
{
pbar.Tick(); //will advance pbar to 1 out of 10.
//we can also advance and update the progressbar text
pbar.Tick("Step 2 of 10");
}
Martijin Larrmanさん、本当に使いやすいライブラリをありがとうございます。
4. GUI.CS
GUI.CSは非常に優れたコンソールUIツールキットです。フル機能のツールボックスを提供し、開発者は初期のコンソールでよく見られたユーザーインターフェースを構築できます。

このUIツールボックスには以下のコントロールが含まれています。
- Buttons
- Labels
- Text Entry
- Text View
- User Inputs
- Windows
- Menus
- ScrollBars
これを使うことで、開発者はコンソールアプリケーションで信じられないような効果を実現できます。このライブラリはMiguel De Icazaによって作られ、コンソール技術の頂点と言えます。実際のプログラム例を見てみましょう。
using Terminal.Gui;
class Demo {
static void Main ()
{
Application.Init ();
var top = Application.Top;
// トップレベルウィンドウを作成
var win = new Window ("MyApp") {
X = 0,
Y = 1, // メニューバーの行を予約
// Dim.Fill() を使用すると、手動で調整する必要なくウィンドウサイズが自動調整される
Width = Dim.Fill (),
Height = Dim.Fill ()
};
top.Add (win);
// メニューを作成
var menu = new MenuBar (new MenuBarItem [] {
new MenuBarItem ("_File", new MenuItem [] {
new MenuItem ("_New", "Creates new file", NewFile),
new MenuItem ("_Close", "", () => Close ()),
new MenuItem ("_Quit", "", () => { if (Quit ()) top.Running = false; })
}),
new MenuBarItem ("_Edit", new MenuItem [] {
new MenuItem ("_Copy", "", null),
new MenuItem ("C_ut", "", null),
new MenuItem ("_Paste", "", null)
})
});
top.Add (menu);
var login = new Label ("Login: ") { X = 3, Y = 2 };
var password = new Label ("Password: ") {
X = Pos.Left (login),
Y = Pos.Top (login) + 1
};
var loginText = new TextField ("") {
X = Pos.Right (password),
Y = Pos.Top (login),
Width = 40
};
var passText = new TextField ("") {
Secret = true,
X = Pos.Left (loginText),
Y = Pos.Top (password),
Width = Dim.Width (loginText)
};
// その他のコントロールを追加
win.Add (
// これは私のお気に入りのレイアウトです
login, password, loginText, passText,
// ここでは絶対配置を使用
new CheckBox (3, 6, "Remember me"),
new RadioGroup (3, 8, new [] { "_Personal", "_Company" }),
new Button (3, 14, "Ok"),
new Button (10, 14, "Cancel"),
new Label (3, 18, "Press F9 or ESC plus 9 to activate the menubar"));
Application.Run ();
}
}
まとめ
開発者として、GUIに夢中になるのは当然のことです。GUIは生産性を高めてくれます。しかし、コンソールアプリケーションも同様に強力です。次回コンソールプログラムを書くときは、ぜひここで紹介したいくつかのライブラリを使って、コンソールアプリケーションに彩りを加えてみてください。
原文标题:Upgrade Your .NET Console App Experience
原文链接:https://khalidabuhakmeh.com/upgraded-dotnet-console-experience
原文作者:Khalid Abuhakmeh
译文:Lamond Lu
本文转载自博客园(古道轻风):https://www.cnblogs.com/88223100/p/upgraded-dotnet-console-experience.html