TermParser
ANSI Terminal escape sequence parser.
This parser is loose implementation of Paul Flo Williams' VT500-series parser. It take a lot of ideas from the annes project, and extends it in some areas.
This library is part of the termKit project.
Features
- Normal key mode + Enhanced key mode (Kitty protocol)
- Mouse tracking (SGR format)
- Cursor position reports (CPR)
- Focus events
- Color queries (OSC 10/11)
- Device attributes (DA1)
- Bracketed paste
- Clipboard operations (OSC 52)
- Terminal size queries
- Keyboard enhancement flags
Usage
This is a simple example how to get started with the package.
final parser = Parser();
// ESC [ 20 ; 10 R
parser.advance([0x1B, 0x5B, 0x32, 0x30, 0x3B, 0x31, 0x30, 0x52]);
assert(parser.hasEvents, 'has events');
assert(parser.nextEvent() == const CursorPositionEvent(20, 10), 'retrieve event');
assert(!parser.hasEvents, 'no more events');
Stream Processing
Use eventTransformer to convert byte streams to events:
stdin.transform(eventTransformer<KeyEvent>())
.listen((event) => print('Key: $event'));
Event Hierarchy
Events are organized into semantic categories for type-safe filtering:
-
InputEvent - User-generated input (keyboard, mouse, paste)
KeyEvent,MouseEvent,PasteEvent,RawKeyEvent
-
ResponseEvent - Terminal responses to queries
CursorPositionEvent,ColorQueryEvent,FocusEventPrimaryDeviceAttributesEvent,KeyboardEnhancementFlagsEventQuerySyncUpdateEvent,QueryTerminalWindowSizeEventNameAndVersionEvent,ClipboardCopyEvent,UnicodeCoreEvent
-
ErrorEvent - Parser/engine errors
EngineErrorEvent
-
InternalEvent - Parser-internal events
NoneEvent
Filtering Events
Use whereType<T>() to filter events by category:
final parser = Parser()
..advance([0x61]) // 'a' key
..advance([0x1B, 0x5B, 0x31, 0x30, 0x3B, 0x32, 0x30, 0x52]); // Cursor position
final events = parser.drainEvents();
// Filter only user input
final inputs = events.whereType<InputEvent>();
// Filter only terminal responses
final responses = events.whereType<ResponseEvent>();
// Filter specific event types
final keyEvents = events.whereType<KeyEvent>();
Acknowledgements
This package is strongly influenced by the following projects:
License
termparser is licensed under the MIT license.
Libraries
- termparser
- ANSI terminal escape sequences parser.
- termparser_events
- Collection of events generated by the parser