libvterm
Neovim の :terminal 機能で使われている C ライブラリ。パーサーだけでなく、スクリーンバッファ管理まで含む。 特徴
パーサー + ステートマシン + スクリーンバッファの3層構造
コールバックベースのAPI
VT220/xterm の広範なシーケンスに対応
セルの属性(色・装飾)、スクロール、リサイズをライブラリ側で処理
API概要
code:c
// ターミナルの作成 (80列 x 24行)
VTerm *vt = vterm_new(24, 80);
// コールバックの設定
VTermScreenCallbacks callbacks = {
.damage = on_damage, // セルが変更されたとき
.moverect = on_moverect, // スクロールが発生したとき
.movecursor = on_movecursor, // カーソルが移動したとき
.settermprop = on_settermprop, // プロパティ変更 (タイトル等)
.bell = on_bell, // ベル
.resize = on_resize, // リサイズ
};
VTermScreen *screen = vterm_obtain_screen(vt);
vterm_screen_set_callbacks(screen, &callbacks, NULL);
vterm_screen_reset(screen, 1);
// バイト列を処理
const char *input = "\x1b[31mHello\x1b[0m";
vterm_input_write(vt, input, strlen(input));
// セルの内容を読み取り
VTermPos pos = { .row = 0, .col = 0 };
VTermScreenCell cell;
vterm_screen_get_cell(screen, pos, &cell);
// cell.attrs.bold → 0
// cell.fg → { .type = VTERM_COLOR_INDEXED, .indexed.idx = 1 } (赤)
// 後片付け
vterm_free(vt);
code:c
// コールバック関数の例
static int on_damage(VTermRect rect, void *user) {
// rect.start_row, rect.start_col, rect.end_row, rect.end_col
// → この矩形領域を再描画する
for (int row = rect.start_row; row < rect.end_row; row++) {
for (int col = rect.start_col; col < rect.end_col; col++) {
VTermPos pos = { .row = row, .col = col };
VTermScreenCell cell;
vterm_screen_get_cell(screen, pos, &cell);
render_cell(row, col, &cell);
}
}
return 0;
}
static int on_movecursor(
VTermPos pos, VTermPos oldpos, int visible, void *user
) {
// カーソルの再描画
update_cursor(pos.row, pos.col);
return 0;
}
長所
パーサー + スクリーンバッファが一体で提供されるため、ターミナルの描画ロジックに集中できる
Neovim で広く使われており、互換性テストが豊富
セル属性の取得APIが充実(色、装飾、幅、リンク等)
リサイズ時のリフロー処理を内蔵
短所
C言語のため、Rust/Go等から使う場合はFFIバインディングが必要
ライブラリサイズが比較的大きい
カスタマイズ性は vte (Rust) より低い
ビルドシステムが独自(Makefile)で、パッケージマネージャとの統合がやや手間