今回はrustでtui(ターミナルユーザインタフェース)ツールを構築するまでの環境構築を紹介します。

これを自作できるところまでのセットアップ方法を紹介します。
1. Rustの環境構築
まずは必要なシステムライブラリをインストールします。ratatui 自体はピュア Rust ですが、バックエンドとして crossterm(ターミナル制御)を使うのが一般的です。
Rustが使える環境構築 : 関連記事は、2026年4月21日に公開予定 (あと19時間)
2. tui開発環境を作る
Rustが動く環境で、以下のコマンドのようにすることでTUI開発環境が作れます。(my-tui-appは任意の名前(新規で作られるディレクトリ名)なので自由に変えてください。)
# プロジェクトの作成
cargo new my-tui-app
cd my-tui-app
# 必要なクレートの追加
# ratatui: TUI本体
# crossterm: ターミナルの描画・イベント制御(クロスプラットフォーム)
cargo add ratatui crossterm3. 実装の基本構造
とりあえず、自動生成のTUIが動くか見てみます。
cargo run実行すると、main.rsにデフォルト生成されるHelloWorld!を出力するコードがコンパイルされ実行されます。

Hello, world! が出力される
TUIのサンプルを動かす
ratatui の開発は、大きく分けて 「ターミナルの初期化」「メインループ(描画&イベント)」「終了処理」 の 3 つで構成されます。
以下のコードを “src/main.rs” に貼り付けてみてください。
サンプルコード:シンプルなTUI
use crossterm::{
event::{self, Event, KeyCode},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::{
backend::CrosstermBackend,
widgets::{Block, Borders, Paragraph},
Terminal,
};
use std::{error::Error, io};
fn main() -> Result<(), Box<dyn Error>> {
// --- 1. セットアップ ---
enable_raw_mode()?; // キー入力をそのままプログラムに送るモード
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen)?; // 専用の描画画面(バッファ)を開く
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
// --- 2. メインループ ---
loop {
// UIの描画
terminal.draw(|f| {
let area = f.area();
let content = Paragraph::new("Hello, Ratatui!\nPress 'q' to quit.")
.block(Block::default().borders(Borders::ALL).title(" TUKUMO TUI Sample "));
f.render_widget(content, area);
})?;
// キー入力の待機と判定
if let Event::Key(key) = event::read()? {
if let KeyCode::Char('q') = key.code {
break; // 'q' が押されたらループを抜ける
}
}
}
// --- 3. クリーンアップ ---
disable_raw_mode()?;
execute!(terminal.backend_mut(), LeaveAlternateScreen)?;
terminal.show_cursor()?;
Ok(())
}このサンプルコードで以下のような、HelloWorldが表示され、qで離脱できるUIになります。

TUIのサンプルコードの実行例
4. UI 開発の考え方:Layout と Widget
ratatui で複雑な UI を作る際は、「画面を分割して、そこにウィジェットをはめ込む」 というパズルに近い感覚になります。
WebのようなコンポーネントベースのモダンUIというよりは、
レイアウトで領域(Rect)を明示的に分割し、それぞれに描画していくスタイルです。
どちらかというと、昔ながらのグリッドベースのUIや、座標指定に近い設計思想になっています。
レイアウトの分割例
例えば、上部に「計算式」、下部に「結果」を表示したい場合は、Layout を使って領域(Rect)を分割します。
use ratatui::layout::{Layout, Constraint, Direction};
fn ui(f: &mut Frame) {
// 画面を垂直に 3:7 で分割
let chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Percentage(30),
Constraint::Percentage(70),
])
.split(f.area());
// chunks[0] に計算式、chunks[1] に結果を配置、といった使い方ができる
f.render_widget(Block::default().title("Input").borders(Borders::ALL), chunks[0]);
f.render_widget(Block::default().title("Output").borders(Borders::ALL), chunks[1]);
}5. 開発効率を上げるヒント
ratatuiなどTUI開発では、以下のような機能を覚えておくと便利です。
Rawモード: ターミナルの標準的な行入力(Enterを押すまで送信されない等)を無効にし、キー入力をダイレクトにプログラムで受け取るモードです。
Alternate Screen: 実行するとターミナルの内容がパッと切り替わり、終了すると元の履歴に戻る「別画面」機能です。vim などと同じ挙動ですね。
ホットリロード感覚: cargo run は高速ですが、UIをいじりながら確認したい場合は、cargo-watch(cargo install cargo-watch)を使って、cargo watch -x run としておくと保存のたびに再起動して確認できます。
次のステップ:文字入力機能追加
まずはこの「Hello World」が動いたら、ui 関数内で Paragraph の中身を変数にして、入力したキーを文字列として蓄積・表示するように改造してみるのが近道です。
Rustで作るTUIツール 文字入力できるようにする: 【Ratatui】Rustで作るTUIツール:ユーザーからの文字入力を受け取る(Input Formの実装)
記事シリーズ「Rustで作る本格TUI開発入門」では、標準入力からコンボ処理、フォーカスやレイアウトなどTUIの構築の基礎についてまとめています。最後にサンプルとなるテンプレートも置いているので、参考に自分専用のTUIを構築してみてください。
Rustで作る本格TUI開発入門
Rust環境で ratatuiのカーゴを用いて、TUIツールを自作できるようになるまでの環境構築と、ツールを作成して公開...