Terminal Kit

TUITerminalColorsMouseInput

GitHub概要

cronvel/terminal-kit

Terminal utilities for node.js

スター3,236
ウォッチ36
フォーク207
作成日:2014年8月6日
言語:JavaScript
ライセンス:MIT License

トピックス

なし

スター履歴

cronvel/terminal-kit Star History
データ取得日時: 2025/7/25 11:10

Terminal Kit

Terminal Kitは、Node.js向けの包括的なターミナルユーティリティライブラリです。256色サポート、キーボード・マウス入力、入力フィールド、プログレスバー、スクリーンバッファ、テキストバッファなど、ターミナルアプリケーション開発に必要な機能を幅広くカバーしています。ncursesに依存しない独立した実装で、高性能と使いやすさを両立しています。

特徴

豊富な色彩表現

  • 256色サポート: フルカラーパレットで美しいUIを作成
  • RGB色指定: 細かい色の調整が可能
  • スタイルマークアップ: シンプルなマークアップ記法でスタイリング
  • チェーンメソッド: 直感的なスタイル適用

入力システム

  • キーボード入力: 特殊キーやコンビネーションに対応
  • マウスサポート: クリック、ホイール、ドラッグ操作
  • 入力フィールド: テキスト入力、自動補完、履歴機能
  • ファイル選択: ファイルブラウザー機能

UIコンポーネント

  • メニューシステム: シングルライン、シングルカラム、グリッドメニュー
  • プログレスバー: 数値、アイテムベースのプログレス表示
  • スピナー: ローディングアニメーション
  • テーブル: データの表形式表示

高度な機能

  • スクリーンバッファ: オフスクリーン描画と高速更新
  • テキストバッファ: テキストの効率的な管理
  • イメージ表示: ターミナルでの画像表示
  • サーバーサイドサポート: HTTPやTelnet経由での提供

基本的な使用方法

インストール

npm install terminal-kit
# or
yarn add terminal-kit

Hello World

const term = require('terminal-kit').terminal;

// 基本的なテキスト出力
term('Hello World!\n');

// 色付きテキスト
term.red('Red text ');
term.bold('Bold text ');
term.bold.underline.red('Mixed styles\n');

// printfスタイルのフォーマット
term.green("My name is %s, I'm %d.\n", 'John', 30);

// マークアップ記法
term("My name is ^rJohn^ and I'm ^g30\n");

入力フィールド

const term = require('terminal-kit').terminal;

term.magenta("Enter your name: ");

term.inputField(
  {
    history: ['John', 'Jane', 'Bob'],
    autoComplete: ['John Doe', 'Jane Smith', 'Bob Johnson'],
    autoCompleteMenu: true
  },
  function(error, input) {
    term.green("\nYour name is '%s'\n", input);
    process.exit();
  }
);

メニューシステム

const term = require('terminal-kit').terminal;

const items = ['File', 'Edit', 'View', 'Help'];

term.clear();

term.singleLineMenu(items, {
  y: 1,
  style: term.inverse,
  selectedStyle: term.dim.blue.bgGreen
}, function(error, response) {
  term('\n').eraseLineAfter.green(
    "#%s selected: %s (%s,%s)\n",
    response.selectedIndex,
    response.selectedText,
    response.x,
    response.y
  );
  process.exit();
});

プログレスバー

const term = require('terminal-kit').terminal;

let progress = 0;
let progressBar;

function doProgress() {
  progress += Math.random() / 10;
  progressBar.update(progress);
  
  if (progress >= 1) {
    setTimeout(() => {
      term('\n');
      process.exit();
    }, 200);
  } else {
    setTimeout(doProgress, 100 + Math.random() * 400);
  }
}

progressBar = term.progressBar({
  width: 80,
  title: 'Processing:',
  eta: true,
  percent: true
});

doProgress();

高度な機能

グリッドメニュー

const term = require('terminal-kit').terminal;
const fs = require('fs');

term.cyan('Choose a file:\n');

const items = fs.readdirSync(process.cwd());

term.gridMenu(items, function(error, response) {
  term('\n').eraseLineAfter.green(
    "#%s selected: %s (%s,%s)\n",
    response.selectedIndex,
    response.selectedText,
    response.x,
    response.y
  );
  process.exit();
});

テーブル表示

const term = require('terminal-kit').terminal;

term.table([
  ['header #1', 'header #2', 'header #3'],
  ['row #1', 'longer cell content', 'cell'],
  ['row #2', 'cell', 'medium cell'],
  ['row #3', 'cell', 'cell']
], {
  hasBorder: true,
  contentHasMarkup: true,
  borderChars: 'lightRounded',
  borderAttr: { color: 'blue' },
  textAttr: { bgColor: 'default' },
  firstCellTextAttr: { bgColor: 'blue' },
  firstRowTextAttr: { bgColor: 'yellow' },
  width: 60,
  fit: true
});

キーボード入力ハンドリング

const term = require('terminal-kit').terminal;

function terminate() {
  term.grabInput(false);
  setTimeout(() => process.exit(), 100);
}

term.bold.cyan('Type anything on the keyboard...\n');
term.green('Hit CTRL-C to quit.\n\n');

term.grabInput({ mouse: 'button' });

term.on('key', function(name, matches, data) {
  console.log("'key' event:", name);
  if (name === 'CTRL_C') {
    terminate();
  }
});

term.on('terminal', function(name, data) {
  console.log("'terminal' event:", name, data);
});

term.on('mouse', function(name, data) {
  console.log("'mouse' event:", name, data);
});

実用例

システムモニター

const term = require('terminal-kit').terminal;
const os = require('os');

class SystemMonitor {
  constructor() {
    this.setupScreen();
    this.startMonitoring();
  }

  setupScreen() {
    term.clear();
    term.hideCursor();
    
    // ヘッダー
    term.bold.blue('System Monitor\n');
    term('='.repeat(50) + '\n');
    
    this.cpuLine = term.getCursorLocation().y;
    term('CPU Usage: \n');
    
    this.memLine = term.getCursorLocation().y;
    term('Memory Usage: \n');
    
    this.uptimeLine = term.getCursorLocation().y;
    term('Uptime: \n');
  }

  startMonitoring() {
    setInterval(() => {
      this.updateStats();
    }, 1000);
    
    term.on('key', (name) => {
      if (name === 'CTRL_C') {
        term.showCursor();
        process.exit();
      }
    });
    
    term.grabInput();
  }

  updateStats() {
    const cpus = os.cpus();
    const totalMem = os.totalmem();
    const freeMem = os.freemem();
    const uptime = os.uptime();
    
    // CPU使用率(簡略版)
    const cpuUsage = Math.random() * 100; // 実際は計算が必要
    term.moveTo(1, this.cpuLine);
    term.eraseLineAfter();
    term(`CPU Usage: ${cpuUsage.toFixed(1)}%`);
    
    // メモリ使用率
    const memUsage = ((totalMem - freeMem) / totalMem) * 100;
    term.moveTo(1, this.memLine);
    term.eraseLineAfter();
    term(`Memory Usage: ${memUsage.toFixed(1)}% (${Math.round((totalMem - freeMem) / 1024 / 1024 / 1024)}GB / ${Math.round(totalMem / 1024 / 1024 / 1024)}GB)`);
    
    // 稼働時間
    const hours = Math.floor(uptime / 3600);
    const minutes = Math.floor((uptime % 3600) / 60);
    term.moveTo(1, this.uptimeLine);
    term.eraseLineAfter();
    term(`Uptime: ${hours}h ${minutes}m`);
  }
}

new SystemMonitor();

エコシステム

関連パッケージ

  • terminal-kit-table: 高度なテーブル機能
  • lazyness: Terminal Kitベースのユーティリティ
  • seventh: コマンドラインパーサー
  • terminal-kit-log: ログ出力拡張

実用例

  • Kitsune: ターミナルベースのゲームエンジン
  • terminal-kit-sample: サンプルアプリケーション集
  • netbeast-cli: IoTデバイス管理CLI
  • spellcast: ターミナルベースRPG

利点

  • 包括的機能: ターミナルアプリ開発に必要な機能を網羅
  • ncurses非依存: 独立した実装でポータビリティが高い
  • 使いやすいAPI: 直感的で学習しやすい
  • 高性能: 最適化されたレンダリング
  • 活発めな開発: 継続的な機能拡張とバグ修正

制約事項

  • バンドルサイズ: 包括的機能のためサイズが大きい
  • 学習コスト: 多機能ゆえに初心者には複雑
  • 独自API: 他のライブラリとの互換性が低い
  • ドキュメント: 一部の高度な機能の説明が不十分

他のライブラリとの比較

項目Terminal KitInkBlessed
アプローチ関数型React型Widget型
学習コスト低(React経験者)
機能の豊富さ非常に高
パフォーマンス
メンテナンス活発活登停滞気味

まとめ

Terminal Kitは、ターミナルアプリケーション開発に必要な機能を包括的に提供する強力なライブラリです。豊富な機能セットと使いやすいAPIにより、シンプルなCLIツールから複雑なインタラクティブアプリケーションまで幅広く対応できます。特に、美しいUIやインタラクティブな機能を求めるプロジェクトに適しています。