Skip to main content

A comprehensive terminal emulator library in Rust with Python bindings - supports true color, alt screen, mouse reporting, bracketed paste, and full Unicode

Project description

Par Term Emu Core Rust

PyPI PyPI - Python Version Runs on Linux | MacOS | Windows Arch x86-64 | ARM | AppleSilicon PyPI - Downloads PyPI - License

What's New in 0.4.0

Sixel Resource Limits and Safety

Version 0.4.0 adds comprehensive resource management for Sixel graphics to prevent memory exhaustion from untrusted or malformed content:

  • Configurable Resource Limits: Control maximum bitmap dimensions (width/height), repeat counts, and in-memory graphics count
  • Per-Terminal Limits: Each terminal instance can have its own safety limits
  • Hard Safety Ceilings: Built-in maximum limits (4096x4096 pixels, 10,000 repeat count) that cannot be exceeded
  • Drop Tracking: Monitor how many graphics were dropped due to resource limits
  • Statistics API: New methods to inspect and tune Sixel resource usage:
    • get_sixel_limits() / set_sixel_limits(max_width, max_height, max_repeat)
    • get_sixel_graphics_limit() / set_sixel_graphics_limit(max_graphics)
    • get_dropped_sixel_graphics()
    • get_sixel_stats() - comprehensive statistics dictionary

Grid Resize Improvements

  • Fixed Scrollback Handling: Scrollback buffer is now properly managed during terminal resize
  • Width Change Safety: Scrollback is cleared when terminal width changes to prevent indexing errors and misaligned lines
  • Height Preservation: Scrollback content is preserved when only terminal height changes
  • Enhanced Tests: Added comprehensive tests for resize behavior with scrollback

Documentation Enhancements

  • Sixel Safety Guide: Extensive documentation on resource limits and safety best practices in docs/ADVANCED_FEATURES.md
  • PTY Integration: Clear examples of applying Sixel limits to PTY-backed terminals
  • API Reference Updates: Complete documentation for all new Sixel management methods

Description

A comprehensive terminal emulator library written in Rust with Python bindings for Python 3.12+. Provides VT100/VT220/VT320/VT420 compatibility with PTY support, matching iTerm2's feature set.

"Buy Me A Coffee"

Table of Contents

Technology

  • Rust (1.75+)
  • Python (3.12+)
  • PyO3 for Python bindings
  • VTE for ANSI parsing
  • portable-pty for cross-platform PTY support

Prerequisites

  • Rust 1.75 or higher
  • Python 3.12 or higher
  • uv package manager
  • maturin (for building Python wheels)

Features

Core VT Compatibility (iTerm2 Feature Parity)

  • VT100/VT220/VT320/VT420 Support: Comprehensive terminal emulation matching iTerm2's capabilities
  • Rich Color Support:
    • Basic 16 ANSI colors
    • 256-color palette
    • 24-bit RGB (true color)
  • Text Attributes: Bold, italic, underline (with styles: straight, double, curly, dotted, dashed), strikethrough, blink, reverse, dim, and hidden
  • Advanced Cursor Control: Full VT100 cursor movement and positioning
  • Line/Character Editing: VT220 insert/delete operations (IL, DL, ICH, DCH, ECH)
  • Rectangle Operations: VT420 fill/copy/erase/modify rectangular regions (DECFRA, DECCRA, DECSERA, DECERA, DECCARA, DECRARA, DECRQCRA, DECSACE)
  • Scrolling Regions: DECSTBM for restricted scrolling areas
  • Tab Stops: Configurable tab stops (HTS, TBC, CHT, CBT)
  • Terminal Modes:
    • Application cursor keys (DECCKM)
    • Origin mode (DECOM)
    • Auto wrap mode (DECAWM)
    • Multiple alternate screen variants (47, 1047, 1049)
  • Mouse Support: Multiple mouse tracking modes (X10, Normal, Button, Any) and encodings (Default, UTF-8, SGR, URXVT)
  • Modern Features:
    • Alternate screen buffer
    • Bracketed paste mode
    • Focus tracking
    • OSC 8 hyperlinks (full support - clickable in TUI)
    • OSC 52 clipboard operations (copy/paste over SSH without X11)
    • OSC 9 / OSC 777 notifications (desktop-style alerts)
    • Shell integration (OSC 133)
    • Sixel graphics (DCS format with half-block rendering)
    • Kitty Keyboard Protocol (progressive enhancement for keyboard handling)
  • Scrollback Buffer: Configurable history of scrolled lines
  • Terminal Resizing: Dynamic size adjustment
  • Unicode Support: Full Unicode including emoji and wide characters
  • High Performance: Written in Rust for speed and safety
  • Python Integration: Easy-to-use Python API via PyO3

PTY Support

  • Interactive Shell Sessions: Spawn and control shell processes
  • Bidirectional I/O: Send input and receive output from running processes
  • Process Management: Start, stop, and monitor child processes
  • Dynamic Resizing: Resize terminal and send SIGWINCH to child process
  • Environment Control: Custom environment variables and working directory
  • Event Loop Integration: Non-blocking update detection for efficient event loops
  • Context Manager Support: Automatic cleanup with Python with statements
  • Cross-Platform: Works on Linux, macOS, and Windows via portable-pty

Utility Functions

  • Text Extraction: Smart word/URL detection, line unwrapping, selection boundaries
  • Content Search: Find text with case-sensitive/insensitive matching, "find next" support
  • Buffer Statistics: Get detailed metrics (memory usage, cell counts, graphics count)
  • Static Utilities: Strip ANSI codes, measure text width, parse colors from strings

Screenshot Support

  • Multiple Formats: PNG, JPEG, BMP, SVG (vector graphics!), and HTML
  • Embedded Font: JetBrains Mono bundled - no font installation required!
  • Programming Ligatures: Supports =>, !=, >=, and other code ligatures
  • Box Drawing: Perfect rendering of box drawing characters (┌─┐│└┘)
  • High-Quality Rendering: True font rendering with antialiasing for raster formats
  • SVG Vector Output: Infinitely scalable screenshots with selectable text
  • HTML Output: Styled HTML with full color support and text attributes (includes full document or content-only mode)
  • Color Emoji Support: Full color emoji rendering with automatic font fallback (NotoColorEmoji, Apple Color Emoji, Segoe UI Emoji)
  • Flag Emoji Support: Proper rendering of flag emojis (🇺🇸 🇨🇳 🇯🇵) via text shaping
  • Cursor Rendering: Capture cursor position with 3 styles (Block, Underline, Bar) and custom colors
  • Sixel Graphics: Inline graphics rendering with full alpha blending support
  • Configurable: Custom fonts, sizes, padding, and quality settings
  • Full Styling: Preserves all colors, text attributes, and decorations
  • Wide Character Support: Renders CJK characters and emoji correctly
  • Python & Rust APIs: Easy-to-use interfaces for both languages
  • TUI Integration: Built-in Ctrl+Shift+S hotkey in the TUI application

Installation

From Source

Requires Rust 1.75+ and Python 3.12+:

# Install maturin (build tool) using uv
uv tool install maturin

# Build and install the package
maturin develop --release

Building a Wheel

maturin build --release
uv pip install target/wheels/par_term_emu_core_rust-*.whl

Terminfo Installation (Optional)

For optimal terminal compatibility, you can install the par-term terminfo definition. This allows applications to fully utilize all terminal capabilities (true color, Sixel graphics, etc.):

# Install for current user
./terminfo/install.sh

# Or install system-wide (requires sudo)
sudo ./terminfo/install.sh --system

# Then use the terminal type
export TERM=par-term
export COLORTERM=truecolor

See terminfo/README.md for detailed information.

Note: If not installed, the terminal defaults to xterm-256color compatibility mode, which works well with most applications.

Shell Integration (Optional but Recommended)

Shell integration enhances your terminal experience with semantic prompt markers. This enables features like prompt navigation, command status tracking, and smart selection.

# Install for your current shell (auto-detects bash/zsh/fish)
cd shell_integration
./install.sh

# Or install for all available shells
./install.sh --all

# Or install for a specific shell
./install.sh bash   # or zsh, or fish

After installation, restart your shell or run:

source ~/.par_term_emu_core_rust_shell_integration.bash  # for bash
source ~/.par_term_emu_core_rust_shell_integration.zsh   # for zsh
source ~/.par_term_emu_core_rust_shell_integration.fish  # for fish

See shell_integration/README.md for detailed information, advanced usage, and customization options.

Quick Start

from par_term_emu_core_rust import Terminal

# Create a terminal with 80 columns and 24 rows
term = Terminal(80, 24)

# Process some text with ANSI codes
term.process_str("Hello, \x1b[31mWorld\x1b[0m!\n")
term.process_str("\x1b[1;32mBold green text\x1b[0m\n")

# Get the content
print(term.content())

# Check cursor position
col, row = term.cursor_position()
print(f"Cursor at: ({col}, {row})")

PTY Quick Start

from par_term_emu_core_rust import PtyTerminal
import time

# Create a terminal and spawn a shell
with PtyTerminal(80, 24) as term:
    term.spawn_shell()

    # Send a command
    term.write_str("echo 'Hello from shell!'\n")
    time.sleep(0.2)

    # Get output
    print(term.content())

    # Resize terminal
    term.resize(100, 30)

    # Exit shell
    term.write_str("exit\n")
# Automatic cleanup on exit

Usage Examples

Basic Text Processing

from par_term_emu_core_rust import Terminal

term = Terminal(80, 24)

# Write plain text
term.process_str("Hello, Terminal!\n")

# Write bytes
term.process(b"Binary data\n")

# Get content
content = term.content()
print(content)

Colors and Styling

term = Terminal(80, 24)

# Basic colors (30-37 for foreground, 40-47 for background)
term.process_str("\x1b[31mRed text\x1b[0m\n")
term.process_str("\x1b[42mGreen background\x1b[0m\n")

# Bright colors (90-97, 100-107)
term.process_str("\x1b[91mBright red\x1b[0m\n")

# 256-color palette
term.process_str("\x1b[38;5;208mOrange text\x1b[0m\n")

# 24-bit RGB colors
term.process_str("\x1b[38;2;255;128;0mRGB orange\x1b[0m\n")

# Text attributes
term.process_str("\x1b[1mBold\x1b[0m ")
term.process_str("\x1b[3mItalic\x1b[0m ")
term.process_str("\x1b[4mUnderline\x1b[0m\n")

Cursor Control

term = Terminal(80, 24)

# Position cursor at row 5, column 10 (1-indexed)
term.process_str("\x1b[5;10HHello")

# Move cursor
term.process_str("\x1b[2A")    # Up 2 rows
term.process_str("\x1b[3B")    # Down 3 rows
term.process_str("\x1b[4C")    # Forward 4 columns
term.process_str("\x1b[5D")    # Back 5 columns

# Hide/show cursor
term.process_str("\x1b[?25l")  # Hide
term.process_str("\x1b[?25h")  # Show

# Check cursor state
visible = term.cursor_visible()
col, row = term.cursor_position()

Screen Manipulation

term = Terminal(80, 24)

term.process_str("Some content\n")

# Clear operations
term.process_str("\x1b[2J")    # Clear entire screen
term.process_str("\x1b[K")     # Clear from cursor to end of line
term.process_str("\x1b[1K")    # Clear from beginning of line to cursor
term.process_str("\x1b[2K")    # Clear entire line

# Scroll
term.process_str("\x1b[5S")    # Scroll up 5 lines
term.process_str("\x1b[5T")    # Scroll down 5 lines

Scrollback Buffer

term = Terminal(40, 10, scrollback=1000)

# Write more lines than terminal height
for i in range(20):
    term.process_str(f"Line {i}\n")

# Get scrollback
scrollback = term.scrollback()
print(f"Scrollback has {len(scrollback)} lines")

for line in scrollback:
    print(f"Scrolled: {line}")

Terminal Resizing

term = Terminal(80, 24)

# Write some content
term.process_str("Content before resize\n")

# Resize terminal
term.resize(100, 30)

# Content is preserved
print(term.size())  # (100, 30)

Cell Inspection

term = Terminal(80, 24)
term.process_str("\x1b[1;31mRed bold text\x1b[0m")

# Get character at position
char = term.get_char(0, 0)
print(f"Character: {char}")

# Get colors
fg_color = term.get_fg_color(0, 0)
bg_color = term.get_bg_color(0, 0)
if fg_color:
    r, g, b = fg_color
    print(f"Foreground: RGB({r}, {g}, {b})")

# Get attributes
attrs = term.get_attributes(0, 0)
if attrs:
    print(f"Bold: {attrs.bold}")
    print(f"Italic: {attrs.italic}")
    print(f"Underline: {attrs.underline}")

Buffer Export

term = Terminal(80, 24, scrollback=1000)

# Write multiple lines with styling
for i in range(50):
    term.process_str(f"\x1b[1;{31 + i % 7}mLine {i}\x1b[0m\n")

# Export as plain text (no styling)
plain_text = term.export_text()
with open("session.txt", "w") as f:
    f.write(plain_text)

# Export with ANSI styling preserved
styled_text = term.export_styled()
with open("session.ansi", "w") as f:
    f.write(styled_text)

# Export as HTML with full styling
html_output = term.export_html(include_styles=True)
with open("session.html", "w") as f:
    f.write(html_output)  # Full HTML document with styles

# Export HTML content only (for embedding)
html_content = term.export_html(include_styles=False)
# Returns just the styled <span> elements, no <html>/<head>/<body>

# Also works with PTY sessions
with PtyTerminal(80, 24) as pty:
    pty.spawn_shell()
    pty.write_str("ls -la\n")
    time.sleep(0.5)

    # Save entire session (scrollback + screen)
    session_log = pty.export_styled()
    with open("pty_session.log", "w") as f:
        f.write(session_log)

Screenshots

Take high-quality screenshots of terminal output with true font rendering:

from par_term_emu_core_rust import Terminal

term = Terminal(80, 24)

# Add some colorful content
term.process_str("\x1b[1;31mHello, World!\x1b[0m\n")
term.process_str("\x1b[32m✓ Success\x1b[0m\n")

# Take screenshot as PNG bytes (default)
png_bytes = term.screenshot()

# Save to file (format auto-detected from extension)
term.screenshot_to_file("output.png")

# Or explicitly specify format
term.screenshot_to_file("output.jpg", format="jpeg", quality=90)

# SVG format for infinitely scalable vector graphics
term.screenshot_to_file("output.svg", format="svg")  # Selectable text!

# HTML format for styled terminal output (embeddable or standalone)
term.screenshot_to_file("output.html", format="html")  # Full HTML document

# Custom configuration
term.screenshot_to_file(
    "output.png",
    font_size=16.0,           # Larger text
    padding=20,               # More padding around edges
    include_scrollback=True   # Include scrollback history
)

# Capture scrolled view (e.g., 10 lines back from current position)
term.screenshot_to_file(
    "output.png",
    scrollback_offset=10      # Capture from 10 lines back
)

# Customize theme colors
term.screenshot_to_file(
    "output.png",
    link_color=(0, 123, 255),     # Custom hyperlink color
    bold_color=(255, 255, 0),     # Custom bold text color
    use_bold_color=True           # Apply custom bold color
)

# Specify custom font (for raster formats)
term.screenshot_to_file(
    "output.png",
    font_path="/path/to/font.ttf"
)

Supported Formats

  • PNG: Lossless, best for text and screenshots (default)
  • JPEG: Smaller file size, configurable quality (1-100)
  • BMP: Uncompressed, large file size
  • SVG: Vector format with infinitely scalable, selectable text - perfect for documentation!
  • HTML: Styled HTML output with full color support and text attributes - embeddable or standalone document

TUI Integration

Note: TUI integration features are available in the sister project par-term-emu-tui-rust, which includes screenshot hotkeys and other interactive features.

Text Extraction & Smart Selection

Extract words, URLs, and lines with intelligent boundary detection:

term = Terminal(80, 24)
term.process_str("Visit https://example.com for more info\n")
term.process_str("Use snake_case or kebab-case naming\n")
term.process_str("Function call: foo(bar, {x: 1, y: \"hello\"})\n")

# Extract word at cursor position
word = term.get_word_at(5, 0)  # "https://example.com"

# Detect and extract URLs
url = term.get_url_at(10, 0)  # "https://example.com"

# Get word boundaries for double-click selection
bounds = term.select_word(5, 1)
if bounds:
    (start_col, start_row), (end_col, end_row) = bounds
    print(f"Word spans from ({start_col}, {start_row}) to ({end_col}, {end_row})")

# Custom word characters (default is iTerm2-compatible: "/-+\~_.")
# For snake_case/identifiers, you might want to include additional chars:
word = term.get_word_at(4, 1, word_chars="_-")  # "snake_case"

# Get full logical line (following wraps)
full_line = term.get_line_unwrapped(0)

# Find matching bracket/parenthesis
term.process_str("if (condition) { action(); }\n")
match_pos = term.find_matching_bracket(3, 3)  # Click on opening '('
if match_pos:
    col, row = match_pos
    print(f"Matching bracket at ({col}, {row})")  # Position of closing ')'

# Select content within delimiters (semantic selection)
term.process_str('message = "Hello, World!"\n')
content = term.select_semantic_region(15, 4, '"')  # Click inside quotes
print(content)  # "Hello, World!"

# Works with multiple delimiter types
term.process_str("data = {key: 'value', num: [1, 2, 3]}\n")
content = term.select_semantic_region(10, 5, "{}[]'\"")  # Click inside braces
print(content)  # "key: 'value', num: [1, 2, 3]"

Content Search

Search terminal content with case-sensitive or case-insensitive matching:

term = Terminal(80, 24)
for i in range(20):
    term.process_str(f"Line {i}: Error in module_{i}\n")

# Find all occurrences
matches = term.find_text("Error", case_sensitive=True)
print(f"Found {len(matches)} matches: {matches}")  # [(8, 0), (8, 1), ...]

# Case-insensitive search
matches = term.find_text("error", case_sensitive=False)

# Find next occurrence from position
next_match = term.find_next("Error", from_col=0, from_row=5)
if next_match:
    col, row = next_match
    print(f"Next match at ({col}, {row})")

# Implement "find next" button
current_pos = (0, 0)
while True:
    match = term.find_next("pattern", current_pos[0], current_pos[1])
    if not match:
        break
    print(f"Match at {match}")
    current_pos = match

Buffer Statistics & Analysis

Get comprehensive statistics about terminal content:

term = Terminal(80, 24, scrollback=10000)

# Get detailed statistics
stats = term.get_stats()
print(f"Dimensions: {stats['cols']}x{stats['rows']}")
print(f"Scrollback: {stats['scrollback_lines']}/{stats['total_cells']} cells")
print(f"Non-empty lines: {stats['non_whitespace_lines']}")
print(f"Graphics: {stats['graphics_count']}")
print(f"Memory: ~{stats['estimated_memory_bytes']} bytes")

# Count content lines (excluding empty lines)
content_lines = term.count_non_whitespace_lines()
print(f"Lines with content: {content_lines}")

# Check scrollback usage
used, capacity = term.get_scrollback_usage()
print(f"Scrollback: {used}/{capacity} lines ({used/capacity*100:.1f}%)")

Static Utility Methods

Use standalone utility functions for text processing:

# Strip ANSI codes from text
colored = "\x1b[31mRed\x1b[0m text"
clean = Terminal.strip_ansi(colored)
print(clean)  # "Red text"

# Measure display width (accounts for wide chars)
text = "Hello 世界"
width = Terminal.measure_text_width(text)
print(f"Display width: {width} columns")  # 11 (5 + 1 + 2 + 2 + 1)

# Handle ANSI codes in width calculation
text_with_ansi = "\x1b[31mHello\x1b[0m"
width = Terminal.measure_text_width(text_with_ansi)
print(f"Width: {width}")  # 5 (ANSI codes don't count)

# Parse colors from various formats
rgb = Terminal.parse_color("#FF5733")  # (255, 87, 51)
rgb = Terminal.parse_color("rgb(255, 87, 51)")  # (255, 87, 51)
rgb = Terminal.parse_color("red")  # (180, 60, 42) - iTerm2 red
rgb = Terminal.parse_color("invalid")  # None

API Reference

Terminal Class

Constructor

Terminal(cols: int, rows: int, scrollback: int = 10000)

Create a new terminal with specified dimensions.

  • cols: Number of columns (width)
  • rows: Number of rows (height)
  • scrollback: Maximum number of scrollback lines (default: 10000)

Methods

  • process(data: bytes): Process byte data (can contain ANSI sequences)
  • process_str(text: str): Process a string (convenience method)
  • content() -> str: Get terminal content as a string
  • size() -> tuple[int, int]: Get terminal dimensions (cols, rows)
  • resize(cols: int, rows: int): Resize the terminal
  • reset(): Reset terminal to default state
  • title() -> str: Get terminal title
  • cursor_position() -> tuple[int, int]: Get cursor position (col, row)
  • cursor_visible() -> bool: Check if cursor is visible
  • keyboard_flags() -> int: Get current Kitty Keyboard Protocol flags
  • set_keyboard_flags(flags: int, mode: int = 1): Set Kitty Keyboard Protocol flags (mode: 0=disable, 1=set, 2=lock)
  • query_keyboard_flags(): Query keyboard flags (response in drain_responses())
  • push_keyboard_flags(flags: int): Push flags to stack and set new flags
  • pop_keyboard_flags(count: int = 1): Pop flags from stack
  • clipboard() -> str | None: Get clipboard content (OSC 52)
  • set_clipboard(content: str | None): Set clipboard content programmatically
  • allow_clipboard_read() -> bool: Check if clipboard read is allowed
  • set_allow_clipboard_read(allow: bool): Set clipboard read permission (security flag)
  • scrollback() -> list[str]: Get scrollback buffer as list of strings
  • scrollback_len() -> int: Get number of scrollback lines
  • get_line(row: int) -> str | None: Get a specific line
  • get_line_cells(row: int) -> list | None: Get cells for a specific line with full metadata
  • get_char(col: int, row: int) -> str | None: Get character at position
  • get_fg_color(col: int, row: int) -> tuple[int, int, int] | None: Get foreground color (RGB)
  • get_bg_color(col: int, row: int) -> tuple[int, int, int] | None: Get background color (RGB)
  • get_underline_color(col: int, row: int) -> tuple[int, int, int] | None: Get underline color (RGB)
  • get_attributes(col: int, row: int) -> Attributes | None: Get text attributes
  • get_hyperlink(col: int, row: int) -> str | None: Get hyperlink URL at position (OSC 8)
  • is_line_wrapped(row: int) -> bool: Check if line is wrapped from previous line
  • is_alt_screen_active() -> bool: Check if alternate screen buffer is active
  • bracketed_paste() -> bool: Check if bracketed paste mode is enabled
  • focus_tracking() -> bool: Check if focus tracking mode is enabled
  • mouse_mode() -> str: Get current mouse tracking mode
  • insert_mode() -> bool: Check if insert mode is enabled
  • line_feed_new_line_mode() -> bool: Check if line feed/new line mode is enabled
  • synchronized_updates() -> bool: Check if synchronized updates mode is enabled (DEC 2026)
  • cursor_style() -> CursorStyle: Get cursor style (block, underline, bar)
  • cursor_color() -> tuple[int, int, int] | None: Get cursor color (RGB)
  • default_fg() -> tuple[int, int, int] | None: Get default foreground color
  • default_bg() -> tuple[int, int, int] | None: Get default background color
  • set_cursor_style(style: CursorStyle): Set cursor style
  • set_cursor_color(r: int, g: int, b: int): Set cursor color (RGB)
  • set_default_fg(r: int, g: int, b: int): Set default foreground color
  • set_default_bg(r: int, g: int, b: int): Set default background color
  • query_cursor_color(): Query cursor color (response in drain_responses())
  • query_default_fg(): Query default foreground color (response in drain_responses())
  • query_default_bg(): Query default background color (response in drain_responses())
  • current_directory() -> str | None: Get current working directory (OSC 7)
  • accept_osc7() -> bool: Check if OSC 7 (CWD) is accepted
  • set_accept_osc7(accept: bool): Set whether to accept OSC 7 sequences
  • disable_insecure_sequences() -> bool: Check if insecure sequences are disabled
  • set_disable_insecure_sequences(disable: bool): Disable insecure/dangerous sequences
  • shell_integration_state() -> ShellIntegration: Get shell integration state (OSC 133)
  • get_paste_start() -> tuple[int, int] | None: Get bracketed paste start position
  • get_paste_end() -> tuple[int, int] | None: Get bracketed paste end position
  • paste(text: str): Simulate bracketed paste
  • get_focus_in_event() -> str: Get focus-in event sequence
  • get_focus_out_event() -> str: Get focus-out event sequence
  • drain_responses() -> list[str]: Drain all pending terminal responses (DA, DSR, etc.)
  • drain_notifications() -> list[tuple[str, str]]: Drain OSC 9/777 notifications (title, message)
  • take_notifications() -> list[tuple[str, str]]: Take notifications without removing
  • has_pending_responses() -> bool: Check if responses are pending
  • has_notifications() -> bool: Check if notifications are pending
  • resize_pixels(width_px: int, height_px: int): Resize terminal by pixel dimensions
  • graphics_count() -> int: Get count of Sixel graphics stored
  • graphics_at_row(row: int) -> list[Graphic]: Get Sixel graphics at specific row
  • clear_graphics(): Clear all Sixel graphics
  • create_snapshot() -> ScreenSnapshot: Create snapshot of current screen state
  • flush_synchronized_updates(): Flush synchronized updates buffer (DEC 2026)
  • simulate_mouse_event(...): Simulate mouse event for testing
  • export_text() -> str: Export entire buffer (scrollback + current screen) as plain text without styling
  • export_styled() -> str: Export entire buffer (scrollback + current screen) with ANSI styling
  • export_html(include_styles: bool = True) -> str: Export current screen as HTML with full styling (full document or content only)
  • screenshot(format, font_path, font_size, include_scrollback, padding, quality, render_cursor, cursor_color, sixel_mode, scrollback_offset, link_color, bold_color, use_bold_color) -> bytes: Take screenshot and return image bytes
  • screenshot_to_file(path, format, font_path, font_size, include_scrollback, padding, quality, render_cursor, cursor_color, sixel_mode, scrollback_offset, link_color, bold_color, use_bold_color): Take screenshot and save to file

Text Extraction Utilities

  • get_word_at(col: int, row: int, word_chars: str | None = None) -> str | None: Extract word at cursor position (default word_chars: "/-+~_." iTerm2-compatible)
  • get_url_at(col: int, row: int) -> str | None: Detect and extract URL at cursor position
  • get_line_unwrapped(row: int) -> str | None: Get full logical line following wrapping
  • select_word(col: int, row: int, word_chars: str | None = None) -> tuple[tuple[int, int], tuple[int, int]] | None: Get word boundaries for smart selection (default word_chars: "/-+~_." iTerm2-compatible)
  • find_matching_bracket(col: int, row: int) -> tuple[int, int] | None: Find matching bracket/parenthesis. Supports (), [], {}, <>. Returns position of matching bracket or None
  • select_semantic_region(col: int, row: int, delimiters: str) -> str | None: Extract content between delimiters. Supports (), [], {}, <>, "", '', ``. Returns content or None

Content Search

  • find_text(pattern: str, case_sensitive: bool = True) -> list[tuple[int, int]]: Find all occurrences of text in visible screen
  • find_next(pattern: str, from_col: int, from_row: int, case_sensitive: bool = True) -> tuple[int, int] | None: Find next occurrence from position

Buffer Statistics

  • get_stats() -> dict[str, int]: Get terminal statistics (cols, rows, scrollback_lines, total_cells, non_whitespace_lines, graphics_count, estimated_memory_bytes)
  • count_non_whitespace_lines() -> int: Count lines containing non-whitespace characters
  • get_scrollback_usage() -> tuple[int, int]: Get scrollback usage (used_lines, max_capacity)

Static Utility Methods

These methods can be called on the class itself (e.g., Terminal.strip_ansi(text)):

  • Terminal.strip_ansi(text: str) -> str: Remove all ANSI escape sequences from text
  • Terminal.measure_text_width(text: str) -> int: Measure display width accounting for wide characters and ANSI codes
  • Terminal.parse_color(color_string: str) -> tuple[int, int, int] | None: Parse color from hex (#RRGGBB), rgb(r,g,b), or name

PtyTerminal Class

A terminal emulator with PTY (pseudo-terminal) support for running interactive shell sessions.

Constructor

PtyTerminal(cols: int, rows: int, scrollback: int = 10000)

Create a new PTY-enabled terminal with specified dimensions.

  • cols: Number of columns (width)
  • rows: Number of rows (height)
  • scrollback: Maximum number of scrollback lines (default: 10000)

PTY-Specific Methods

  • spawn(cmd: str, args: list[str] = [], env: dict[str, str] | None = None, cwd: str | None = None): Spawn a command with arguments
  • spawn_shell(shell: str | None = None): Spawn a shell (defaults to /bin/bash)
  • write(data: bytes): Write bytes to the PTY
  • write_str(text: str): Write string to the PTY (convenience method)
  • is_running() -> bool: Check if the child process is still running
  • wait() -> int | None: Wait for child process to exit and return exit code
  • try_wait() -> int | None: Non-blocking check if child has exited
  • kill(): Forcefully terminate the child process
  • update_generation() -> int: Get current update generation counter
  • has_updates_since(generation: int) -> bool: Check if terminal updated since generation
  • send_resize_pulse(): Send SIGWINCH to child process after resize
  • get_default_shell() -> str: Get the default shell path

Note: PtyTerminal inherits all methods from Terminal class listed above.

Context Manager Support

with PtyTerminal(80, 24) as term:
    term.spawn_shell()
    term.write_str("echo 'Hello'\n")
    # Automatic cleanup on exit

Attributes Class

Represents text attributes for a cell.

Properties

  • bold: bool: Bold text
  • dim: bool: Dim text
  • italic: bool: Italic text
  • underline: bool: Underlined text
  • blink: bool: Blinking text
  • reverse: bool: Reverse video
  • hidden: bool: Hidden text
  • strikethrough: bool: Strikethrough text

CursorStyle Enum

Cursor display styles (DECSCUSR):

  • CursorStyle.BlinkingBlock: Blinking block cursor (default)
  • CursorStyle.SteadyBlock: Steady block cursor
  • CursorStyle.BlinkingUnderline: Blinking underline cursor
  • CursorStyle.SteadyUnderline: Steady underline cursor
  • CursorStyle.BlinkingBar: Blinking bar/I-beam cursor
  • CursorStyle.SteadyBar: Steady bar/I-beam cursor

UnderlineStyle Enum

Text underline styles:

  • UnderlineStyle.None_: No underline
  • UnderlineStyle.Straight: Straight underline (default)
  • UnderlineStyle.Double: Double underline
  • UnderlineStyle.Curly: Curly underline (for spell check)
  • UnderlineStyle.Dotted: Dotted underline
  • UnderlineStyle.Dashed: Dashed underline

ShellIntegration Class

Shell integration state (OSC 133 and OSC 7):

  • in_prompt: bool: True if currently in prompt (marker A)
  • in_command_input: bool: True if currently in command input (marker B)
  • in_command_output: bool: True if currently in command output (marker C)
  • current_command: str | None: The command that was executed
  • last_exit_code: int | None: Exit code from last command (marker D)
  • cwd: str | None: Current working directory from OSC 7

Graphic Class

Sixel graphic metadata:

  • row: int: Display row
  • col: int: Display column
  • width: int: Width in pixels
  • height: int: Height in pixels
  • data: bytes: Image data

ScreenSnapshot Class

Immutable snapshot of screen state:

  • content() -> str: Get full screen content
  • cursor_position() -> tuple[int, int]: Cursor position at snapshot time
  • size() -> tuple[int, int]: Terminal dimensions

Supported ANSI/VT Sequences

This terminal emulator provides comprehensive VT100/VT220/VT320/VT420 compatibility, matching iTerm2's feature set.

Cursor Movement (VT100)

  • ESC[<n>A: Cursor up n lines (CUU)
  • ESC[<n>B: Cursor down n lines (CUD)
  • ESC[<n>C: Cursor forward n columns (CUF)
  • ESC[<n>D: Cursor back n columns (CUB)
  • ESC[<n>E: Cursor next line (CNL)
  • ESC[<n>F: Cursor previous line (CPL)
  • ESC[<n>G: Cursor horizontal absolute (CHA)
  • ESC[<row>;<col>H: Cursor position (CUP)
  • ESC[<row>;<col>f: Cursor position (HVP - alternative)
  • ESC[<n>d: Line position absolute (VPA)
  • ESC[s: Save cursor position (ANSI.SYS)
  • ESC[u: Restore cursor position (ANSI.SYS)
  • ESC 7: Save cursor (DECSC)
  • ESC 8: Restore cursor (DECRC)

Display Control (VT100)

  • ESC[<n>J: Erase in display (ED)
    • n=0: Clear from cursor to end
    • n=1: Clear from beginning to cursor
    • n=2: Clear entire screen
    • n=3: Clear entire screen and scrollback
  • ESC[<n>K: Erase in line (EL)
    • n=0: Clear from cursor to end of line
    • n=1: Clear from beginning of line to cursor
    • n=2: Clear entire line

Line/Character Editing (VT220)

  • ESC[<n>L: Insert n blank lines (IL)
  • ESC[<n>M: Delete n lines (DL)
  • ESC[<n>@: Insert n blank characters (ICH)
  • ESC[<n>P: Delete n characters (DCH)
  • ESC[<n>X: Erase n characters (ECH)

Rectangle Operations (VT420)

Advanced text editing operations that work on rectangular regions of the screen:

  • ESC[<Pc>;<Pt>;<Pl>;<Pb>;<Pr>$x: Fill Rectangular Area (DECFRA)

    • Pc: Character code to fill (e.g., 88 for 'X', 42 for '*')
    • Pt: Top row (1-indexed)
    • Pl: Left column (1-indexed)
    • Pb: Bottom row (1-indexed)
    • Pr: Right column (1-indexed)
    • Fills rectangle with specified character using current text attributes
  • ESC[<Pts>;<Pls>;<Pbs>;<Prs>;<Pps>;<Ptd>;<Pld>;<Ppd>$v: Copy Rectangular Area (DECCRA)

    • Pts, Pls, Pbs, Prs: Source rectangle (top, left, bottom, right)
    • Pps: Source page (use 1 for current screen)
    • Ptd, Pld: Destination position (top, left)
    • Ppd: Destination page (use 1 for current screen)
    • Copies rectangular region to new location
  • ESC[<Pt>;<Pl>;<Pb>;<Pr>${: Selective Erase Rectangular Area (DECSERA)

    • Pt: Top row (1-indexed)
    • Pl: Left column (1-indexed)
    • Pb: Bottom row (1-indexed)
    • Pr: Right column (1-indexed)
    • Selectively erases rectangle (respects character protection attribute)
  • ESC[<Pt>;<Pl>;<Pb>;<Pr>$z: Erase Rectangular Area (DECERA)

    • Pt: Top row (1-indexed)
    • Pl: Left column (1-indexed)
    • Pb: Bottom row (1-indexed)
    • Pr: Right column (1-indexed)
    • Unconditionally erases rectangle (ignores protection)
  • ESC[<Pt>;<Pl>;<Pb>;<Pr>;<Ps>$r: Change Attributes in Rectangular Area (DECCARA)

    • Pt, Pl, Pb, Pr: Rectangle coordinates (top, left, bottom, right)
    • Ps: SGR attributes to apply (0=reset, 1=bold, 4=underline, 5=blink, 7=reverse, 8=hidden)
    • Changes text attributes in rectangle
  • ESC[<Pt>;<Pl>;<Pb>;<Pr>;<Ps>$t: Reverse Attributes in Rectangular Area (DECRARA)

    • Pt, Pl, Pb, Pr: Rectangle coordinates (top, left, bottom, right)
    • Ps: Attributes to reverse (0=all, 1=bold, 4=underline, 5=blink, 7=reverse, 8=hidden)
    • Toggles attributes in rectangle
  • ESC[<Pi>;<Pg>;<Pt>;<Pl>;<Pb>;<Pr>*y: Request Checksum of Rectangular Area (DECRQCRA)

    • Pi: Request ID
    • Pg: Page number (use 1 for current screen)
    • Pt, Pl, Pb, Pr: Rectangle coordinates
    • Response: DCS Pi ! ~ xxxx ST (16-bit checksum in hex)
  • ESC[<Ps>*x: Select Attribute Change Extent (DECSACE)

    • Ps = 0 or 1: Stream mode (attributes wrap at line boundaries)
    • Ps = 2: Rectangle mode (strict rectangular boundaries, default)
    • Affects how DECCARA and DECRARA apply attributes

Use Cases: Efficient text manipulation in editors (vim, emacs), drawing box characters, clearing specific screen regions without affecting surrounding content, attribute modification without changing text, verification of screen regions via checksums.

Scrolling (VT100/VT220)

  • ESC[<n>S: Scroll up n lines (SU)
  • ESC[<n>T: Scroll down n lines (SD)
  • ESC[<top>;<bottom>r: Set scrolling region (DECSTBM)
  • ESC M: Reverse index (RI) - scroll down at top
  • ESC D: Index (IND) - scroll up at bottom
  • ESC E: Next line (NEL)

Colors and Attributes (VT100/ECMA-48)

  • ESC[0m: Reset all attributes (SGR 0)
  • ESC[1m: Bold
  • ESC[2m: Dim
  • ESC[3m: Italic
  • ESC[4m: Underline (basic, defaults to straight)
  • ESC[4:0m: No underline (explicit)
  • ESC[4:1m: Straight underline (default)
  • ESC[4:2m: Double underline
  • ESC[4:3m: Curly underline (spell check, errors)
  • ESC[4:4m: Dotted underline
  • ESC[4:5m: Dashed underline
  • ESC[5m: Blink
  • ESC[7m: Reverse
  • ESC[8m: Hidden
  • ESC[9m: Strikethrough
  • ESC[22m: Normal intensity (not bold or dim)
  • ESC[23m: Not italic
  • ESC[24m: Not underlined
  • ESC[25m: Not blinking
  • ESC[27m: Not reversed
  • ESC[28m: Not hidden
  • ESC[29m: Not strikethrough
  • ESC[30-37m: Foreground colors (basic)
  • ESC[40-47m: Background colors (basic)
  • ESC[90-97m: Bright foreground colors (aixterm)
  • ESC[100-107m: Bright background colors (aixterm)
  • ESC[38;5;<n>m: 256-color foreground
  • ESC[48;5;<n>m: 256-color background
  • ESC[38;2;<r>;<g>;<b>m: RGB/true color foreground
  • ESC[48;2;<r>;<g>;<b>m: RGB/true color background
  • ESC[39m: Default foreground color
  • ESC[49m: Default background color

Tab Stops (VT100)

  • ESC H: Set tab stop at current column (HTS)
  • ESC[<n>g: Tab clear (TBC)
    • n=0: Clear tab at current column
    • n=3: Clear all tabs
  • ESC[<n>I: Cursor forward tabulation (CHT)
  • ESC[<n>Z: Cursor backward tabulation (CBT)

Terminal Modes (DEC Private Modes)

  • ESC[?1h/l: Application cursor keys (DECCKM)
  • ESC[?6h/l: Origin mode (DECOM)
  • ESC[?7h/l: Auto wrap mode (DECAWM)
  • ESC[?25h/l: Show/hide cursor (DECTCEM)
  • ESC[?47h/l: Alternate screen buffer
  • ESC[?1047h/l: Alternate screen buffer (alternate)
  • ESC[?1048h/l: Save/restore cursor
  • ESC[?1049h/l: Save cursor and use alternate screen

Mouse Support (xterm)

  • ESC[?1000h/l: Normal mouse tracking
  • ESC[?1002h/l: Button event mouse tracking
  • ESC[?1003h/l: Any event mouse tracking
  • ESC[?1005h/l: UTF-8 mouse encoding
  • ESC[?1006h/l: SGR mouse encoding
  • ESC[?1015h/l: URXVT mouse encoding

Advanced Features

  • ESC[?1004h/l: Focus tracking
  • ESC[?2004h/l: Bracketed paste mode
  • ESC[?2026h/l: Synchronized updates (DEC 2026) - Batch screen updates for flicker-free rendering

Kitty Keyboard Protocol

Progressive enhancement for keyboard handling with flags for disambiguation and event reporting:

  • CSI = flags ; mode u: Set keyboard protocol mode
    • flags: Bitmask (1=disambiguate, 2=report events, 4=alternate keys, 8=report all, 16=associated text)
    • mode: 0=disable, 1=set, 2=lock, 3=report
  • CSI ? u: Query current keyboard flags (response: CSI ? flags u)
  • CSI > flags u: Push current flags to stack and set new flags
  • CSI < count u: Pop flags from stack (count times)

Note: Flags are maintained separately for main and alternate screen buffers with independent stacks.

Device Queries (VT100/VT220)

  • ESC[<n>n: Device Status Report (DSR)
  • ESC[c: Device Attributes (DA)

OSC Sequences

  • OSC 0;<title>ST: Set window title (icon + title)
  • OSC 2;<title>ST: Set window title
  • OSC 7;<cwd>ST: Set current working directory
  • OSC 8;;<url>ST: Hyperlinks (iTerm2/VTE compatible) - Full support with clickable TUI rendering
  • OSC 52;c;<data>ST: Clipboard operations (xterm/iTerm2 compatible) - Works over SSH without X11!
    • <data>: base64 encoded text to copy to clipboard
    • ?: Query clipboard (requires set_allow_clipboard_read(true) for security)
    • Empty data clears clipboard
  • OSC 133;<marker>ST: Shell integration (iTerm2/VSCode)
    • A: Prompt start
    • B: Command start
    • C: Command executed
    • D;<exit_code>: Command finished
  • OSC 9;<message>ST: Notifications (iTerm2/ConEmu style) - Send desktop-style notifications
    • Simple format with message only (no title)
  • OSC 777;notify;<title>;<message>ST: Notifications (urxvt style) - Structured notifications
    • Supports both title and message
    • Use for desktop notifications, alerts, or completion notices

Control Characters

  • BEL (0x07): Bell
  • BS (0x08): Backspace
  • HT (0x09): Horizontal tab
  • LF (0x0A): Line feed
  • CR (0x0D): Carriage return

Reset Sequences

  • ESC c: Reset to initial state (RIS)

Examples

See the examples/ directory for complete usage examples:

Terminal Emulation Examples

Basic Examples

  • basic_usage_improved.py: Enhanced basic usage with visual output
  • colors_demo.py: Color support demonstration
  • cursor_movement.py: Cursor control examples
  • scrollback_demo.py: Scrollback buffer usage
  • text_attributes.py: Text styling examples
  • unicode_emoji.py: Unicode and emoji support demonstration

Advanced Features

  • alt_screen.py: Alternate screen buffer
  • mouse_tracking.py: Mouse event handling
  • bracketed_paste.py: Bracketed paste mode demonstration
  • synchronized_updates.py: Synchronized updates (DEC 2026) for flicker-free rendering
  • shell_integration.py: Shell integration (OSC 133)
  • test_osc52_clipboard.py: OSC 52 clipboard operations (SSH clipboard support)
  • test_kitty_keyboard.py: Kitty Keyboard Protocol demonstration
  • test_underline_styles.py: Underline styles (SGR 4:x) for modern text decoration
  • notifications.py: OSC 9 / OSC 777 notification support (desktop-style alerts)
  • rectangle_operations.py: VT420 rectangle operations (DECFRA, DECCRA, DECSERA, DECERA, DECCARA, DECRARA, DECRQCRA, DECSACE)
  • hyperlink_demo.py: OSC 8 hyperlinks (clickable URLs in terminal)

Graphics and Visual

  • display_image_sixel.py: Display images using Sixel graphics
  • test_sixel_simple.py: Simple Sixel graphics demonstration
  • test_sixel_display.py: Advanced Sixel graphics testing
  • screenshot_demo.py: Comprehensive screenshot feature demonstration

TUI Applications

  • test_tui_clipboard.py: TUI clipboard integration demonstration
  • feature_showcase.py: Comprehensive feature showcase with TUI

PTY Examples

  • pty_basic.py: Basic PTY usage - spawn commands and capture output
  • pty_shell.py: Interactive shell sessions
  • pty_custom_env.py: Custom environment variables and working directory
  • pty_resize.py: Dynamic terminal resizing with SIGWINCH
  • pty_with_par_term.py: Using custom par-term terminfo for optimal compatibility
  • pty_multiple.py: Managing multiple concurrent PTY sessions
  • pty_event_loop.py: Event loop integration with update tracking
  • pty_mouse_events.py: Mouse event handling in PTY sessions

TUI Demo Application

Note: A full-featured TUI (Text User Interface) application for this terminal emulator is available in the sister project par-term-emu-tui-rust. The TUI provides an interactive terminal application with themes, clipboard integration, and more.

Installation: pip install par-term-emu-tui-rust

Security

Important: When using PTY functionality, follow security best practices to prevent command injection and other vulnerabilities.

See SECURITY.md for detailed security guidelines including:

  • Command injection prevention
  • Environment variable security
  • Input validation
  • Resource limits
  • Privilege management

Running Tests

# Run Rust tests
cargo test

# Run Python tests (requires pytest)
uv pip install pytest
pytest tests/

Performance

The library is implemented in Rust for high performance:

  • Zero-copy operations where possible
  • Efficient grid representation
  • Fast ANSI sequence parsing using the vte crate
  • Minimal Python/Rust boundary crossings

Architecture

The library consists of several key components:

Terminal Emulation Core

  • Cell: Represents a single terminal cell with character, colors, and attributes
  • Grid: Manages the 2D terminal buffer and scrollback
  • Cursor: Tracks cursor position and visibility
  • Color: Handles various color formats (named, 256-color, RGB)
  • Terminal: Main terminal emulator that ties everything together

PTY Support

  • PtySession: Manages PTY and child process lifecycle
  • PtyError: Error types for PTY operations
  • Reader Thread: Background thread that processes PTY output
  • Update Generation: Efficient change detection for event loops

Python Bindings

  • PyTerminal: Python wrapper for Terminal (ANSI parsing)
  • PyPtyTerminal: Python wrapper for PtySession (interactive shells)
  • PyO3: Zero-cost bindings between Rust and Python

Contributing

Contributions are welcome! Please feel free to submit issues or pull requests.

Development Setup

  1. Clone the repository and set up the environment:

    git clone https://github.com/paulrobello/par-term-emu-core-rust.git
    cd par-term-emu-core-rust
    make setup-venv  # Create virtual environment and install dependencies
    
  2. Install pre-commit hooks (recommended):

    make pre-commit-install
    

    This will automatically run all quality checks (formatting, linting, type checking, tests) before each commit.

  3. Build and test:

    make dev          # Build the library in development mode
    make test-python  # Run tests
    

Code Quality

All contributions must pass the following checks:

  • Rust formatting: cargo fmt
  • Rust linting: cargo clippy -- -D warnings
  • Python formatting: make fmt-python
  • Python linting: make lint-python
  • Python type checking: pyright
  • Python tests: make test-python

TIP: Use make pre-commit-install to automate all these checks on every commit!

For more detailed development instructions, see CLAUDE.md.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Author

Paul Robello - probello@gmail.com

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

par_term_emu_core_rust-0.4.0.tar.gz (872.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

par_term_emu_core_rust-0.4.0-cp314-cp314-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.14Windows x86-64

par_term_emu_core_rust-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

par_term_emu_core_rust-0.4.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

par_term_emu_core_rust-0.4.0-cp314-cp314-macosx_10_12_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

par_term_emu_core_rust-0.4.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.3 MB view details)

Uploaded CPython 3.14macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

par_term_emu_core_rust-0.4.0-cp313-cp313-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.13Windows x86-64

par_term_emu_core_rust-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

par_term_emu_core_rust-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

par_term_emu_core_rust-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

par_term_emu_core_rust-0.4.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.3 MB view details)

Uploaded CPython 3.13macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

par_term_emu_core_rust-0.4.0-cp312-cp312-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.12Windows x86-64

par_term_emu_core_rust-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

par_term_emu_core_rust-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

par_term_emu_core_rust-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

par_term_emu_core_rust-0.4.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.3 MB view details)

Uploaded CPython 3.12macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file par_term_emu_core_rust-0.4.0.tar.gz.

File metadata

  • Download URL: par_term_emu_core_rust-0.4.0.tar.gz
  • Upload date:
  • Size: 872.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for par_term_emu_core_rust-0.4.0.tar.gz
Algorithm Hash digest
SHA256 b6db25782810ace15ffeb144a6c6bc1a715bdc49e1c7822771f312f5bec86d16
MD5 7f4d2b6bb985fce8b46b693912a95d4d
BLAKE2b-256 1d5ad451b6df603712eba21122afef411511ca888de1b6339ccdf8073ce8e711

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0.tar.gz:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 2b678969095b44994739adb83c583ccc296ea51d42e01dd4d50c288d9f915a4b
MD5 e5887129ced247b2bfa261414f915669
BLAKE2b-256 d5bf557524b1a63068c12dec3d467db1f70b8cc68e46acca42454a65d9e8b4f9

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp314-cp314-win_amd64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f77dfe30ba86f40d46fb6adb5fefe579c5cba56b9020d8c899e821f43a4d2307
MD5 2660e581881339c131e15ad4b294bdfc
BLAKE2b-256 ea13f5a5bba29acb9076e629e2aa5868c4529d239fc6d95ea3d6bc325b5aa45a

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 94a243c8aa652e8fa8312806194f14149d70f76ccfd04715308d9b4562a04f89
MD5 702392f048419476854af53c0b111273
BLAKE2b-256 8162670e1d5ef2359e58fdbb5dbe21797a8c6fd2f1d6074825c0892f46037883

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8033a472ed8a1a65d0b25923b5b7f8091a7b33c0415369f8276d567e19764b2b
MD5 a36ea9ebe8921d965eb1d7d58797acf6
BLAKE2b-256 88a44e1224be8f6d9360991c46ff022ee8438bd233ff44a5a2326a0e0babbad2

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp314-cp314-macosx_10_12_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 f29c34e0ef88c4f04454d3bdbf17dd3c04042e2aa558267ce5d22499d975975d
MD5 1b21fb97d649643faa94c9268c545b2e
BLAKE2b-256 b60d284687b0ac945001dd3e17b3e3c5a57e4bf2d23d73fbd9be768d33e85f08

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ea9e6add1ba39c2606c187b64c6e0f0d182f10a1c5a21202dca41bfa2f2ab68f
MD5 25db87d4f42341e3f27660fa315ad624
BLAKE2b-256 2d2dbdedc0761d7b1862d88ff22176fd6962bfd88962b78683d56a5cc59a75c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp313-cp313-win_amd64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e7b2d21a140699e088968f5ca00e63946c6cfe6ae34c9b43e64bf7f03bcf31c0
MD5 049fa041b525f2082a3b5decb70a06ce
BLAKE2b-256 164c521c73449fcf4ec959afe68506f08d21a9f15f8bcad8e40ae35b701a22a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 887774dcf12e1a9928038fd3616990f8adcb8aefd63eb4672b2eca1fe8720a13
MD5 2f08570e5386d02acb974fb79cf9e552
BLAKE2b-256 051feb718b3b8b91d408772a5fc51b08ccf8ac6e5244762ecf82e9b279e2aa63

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 20e8c7fbb671fdf8384f27316534f914906ef6b185f011b1f0b2e3d0dfd6038b
MD5 f381957a236ba94122412147cc619e86
BLAKE2b-256 84977c50f721cc07642bed77c11ea405e0c391eff3b6663419cc3fb19e699fa2

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 68d87f4c3edeb6356e4cc791d44984c0a95ddc19359f1b15db2109bee5d0d9fc
MD5 20920192d6ec4c180d55892f867870ab
BLAKE2b-256 c2ce74507209659dbd536ee97145e9fde8a14b32810f405c0e7902f13567c048

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f66220c19941875427185b5e8fce3dcfc5cd7b9aea97d5c85c787cb8b0b7a1f1
MD5 c0f3bdfba989e551df26074943869ca0
BLAKE2b-256 c0bc346fefd14ec00c5e38f17f39fb7064c307d87d3e843d5aeab8dbbb8e4a0b

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp312-cp312-win_amd64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4cfccffa5409dc5210ac7b14e0b34df6864effe68e75895ac18b7148fc88b3df
MD5 2ab237d655ac4eddfd3223d39a84ea78
BLAKE2b-256 838339e1d8be9ee97222ec360d827977b4f4ec9cec56544e7520b8a966b8ed97

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f59168429f57bf74be71a9d10cac45bba35c62c174143e1162ebf3df17df377c
MD5 fb4f5eaaef61a3c7d29f34eaadc4b325
BLAKE2b-256 8091ea083d354d23cfceabf932162475b2b6e175c252ac2dca292242df742ab4

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5355f402937722662a24943c3b3040087457d0f739238724ddfcc9339343cd81
MD5 4b2f82fc161a2dfe60ea015777c5df34
BLAKE2b-256 6e90134e507e7ffd5d034601b769232fb86d509d50577f49d67719a2556c78d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file par_term_emu_core_rust-0.4.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for par_term_emu_core_rust-0.4.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 1188bd8514c5cf4323a21b42f4540e9e4cae3721172905d45e9d2dfcc0eeeb6a
MD5 a63926f985ef6902b239c1b690c7c23e
BLAKE2b-256 a9e18ec1c0eeb8f3d4cf7f3250fce2563b55b2050e8227c41a39136286906b71

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_term_emu_core_rust-0.4.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: deployment.yml on paulrobello/par-term-emu-core-rust

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page