kterm

Actions Package version GitHub repo size GitHub issues GitHub pull requests

kterm is a high-performance terminal emulator engine for Flutter applications, with support for mobile and desktop platforms.

This package requires Flutter version >=3.0.0

Screenshots

Features

  • 📦 Works out of the box No special configuration required.
  • 🚀 Fast Renders at 60fps.
  • 😀 Wide character support Supports CJK and emojis.
  • ✂️ Customizable
  • Frontend independent: The terminal core can work without flutter frontend.
  • 🖼️ Kitty Graphics Protocol: Support for inline images (PNG, JPEG, RGBA)
  • ⌨️ Kitty Keyboard Protocol: Full support for modern key combinations

Key Features

  • 🖥️ Modern Key Support: Full Kitty Keyboard Protocol implementation.
  • 📚 Progressive Enhancement: Supports CSI > n u stack (push/pop) for nested terminal modes.
  • 🔍 Zero Ambiguity: No more Tab vs Ctrl+I confusion in Neovim/Helix — modifier keys are always distinguishable.
  • 🔎 Search: Built-in search with regex, case sensitivity, and whole word matching support.

What's new in 3.0.0:

  • 📱 Enhanced support for mobile platforms.
  • ⌨️ Integrates with Flutter's shortcut system.
  • 🎨 Allows changing theme at runtime.
  • 💪 Better performance. No tree rebuilds anymore.
  • 🈂️ Works with IMEs.

Getting Started

1. Add this to your package's pubspec.yaml file:

dependencies:
  ...
  kterm: ^1.0.0

2. Create the terminal:

import 'package:kterm/kterm.dart';
...
terminal = Terminal();

Listen to user interaction with the terminal by simply adding a onOutput callback:

terminal = Terminal();

terminal.onOutput = (output) {
  print('output: $output');
}

3. Create the view, attach the terminal to the view:

import 'package:kterm/flutter.dart';
...
child: TerminalView(terminal),

4. Write something to the terminal:

terminal.write('Hello, world!');

Done!

Usage

Basic Usage

import 'package:kterm/kterm.dart';
import 'package:kterm/flutter.dart';

final terminal = Terminal();
final controller = TerminalController();

TerminalView(
  terminal,
  controller: controller,
);

With GraphicsManager (Kitty Graphics Protocol)

import 'package:kterm/kterm.dart';
import 'package:kterm/flutter.dart';

final terminal = Terminal(
  graphicsManager: GraphicsManager(),
);
final controller = TerminalController();

TerminalView(
  terminal,
  controller: controller,
);

Enable Kitty Keyboard Protocol

terminal.setKittyMode(true);

Search Functionality

kterm includes built-in search functionality with support for:

  • Case sensitive search
  • Regular expression patterns
  • Whole word matching

Option 1: Enable via TerminalView (with keyboard shortcuts)

The simplest way to enable search - automatically sets up callbacks and keyboard shortcuts.

import 'package:kterm/kterm.dart';
import 'package:kterm/flutter.dart';

final terminal = Terminal();
final controller = TerminalController();

TerminalView(
  terminal,
  controller: controller,
  showSearchBar: true,  // Enables search bar and keyboard shortcuts
);

Keyboard shortcuts:

Shortcut Action
Ctrl+F / Cmd+F Open search
F3 / Cmd+G Next match
Shift+F3 / Cmd+Shift+G Previous match
Escape Close search

Option 2: Manual search bar implementation

import 'package:kterm/kterm.dart';
import 'package:kterm/flutter.dart';

final terminal = Terminal();
final controller = TerminalController();

// Setup search text provider
controller.onGetText = () => terminal.buffer.getText();

Column(
  children: [
    TerminalSearchBar(
      controller: controller,
      onClose: () => controller.closeSearch(),
    ),
    Expanded(
      child: TerminalView(terminal, controller: controller),
    ),
  ],
);

Programmatic search control

// Open search mode
controller.openSearch();

// Perform a search
controller.search('pattern');

// Navigate results
controller.searchNext();
controller.searchPrevious();

// Set search options
controller.setSearchOptions({
  SearchOption.caseSensitive,
  SearchOption.regex,
  SearchOption.wholeWord,
});

// Toggle individual options
controller.toggleSearchOption(SearchOption.caseSensitive);

// Close search
controller.closeSearch();
Property Type Description
isSearching bool Whether search mode is active
searchPattern String? Current search pattern
searchResults List<BufferRange> All matching results
currentSearchIndex int Index of current result (-1 if none)
searchResultCount int Total number of matches
hasSearchResults bool Whether any matches found

More examples

For a complete project built with kterm, check out TerminalStudio.

Features and bugs

Please file feature requests and bugs at the issue tracker.

Contributions are always welcome!

License

This project is licensed under an MIT license.