Skip to main content

A keyboard-driven navigation widget for Textual TUI applications

Project description

Ruff PyPI-Server Pyversions License: MIT Downloads Coverage Status

Textual Jumper

A keyboard-driven navigation widget for Textual TUI applications. Jump to any focusable widget instantly using intuitive keyboard shortcuts!

Note: This was created with Claude Code

Features

cover_image

  • Instant Navigation - Jump to any widget with 1-2 keystrokes
  • Multi-Character Keys - Automatically generates key combinations for many widgets
  • Visual Feedback - Real-time highlighting shows typed characters
  • Customizable - Define your own key mappings or use defaults
  • Zero Dependencies - Only requires Textual
  • Easy Integration - Add to existing apps in minutes

Installation

Using uv:

uv add textual-jumper

Using pip:

pip install textual-jumper

Try the Demo

Run the interactive demo to see Textual Jumper in action:

uvx textual-jumper

Press Ctrl+O to activate jump mode, then press a key to jump to that widget!

Quick Start

from textual.app import App, ComposeResult
from textual.widgets import Input, Button, Header, Footer
from textual_jumper import Jumper

class MyApp(App):
    BINDINGS = [("ctrl+o", "show_overlay", "Jump")]

    def compose(self) -> ComposeResult:
        yield Header()
        yield Jumper()

        # Focus mode - widget will receive focus
        name_input = Input(placeholder="Name")
        name_input.jump_mode = "focus"
        yield name_input

        email_input = Input(placeholder="Email")
        email_input.jump_mode = "focus"
        yield email_input

        # Click mode - widget will be clicked
        submit_button = Button("Submit")
        submit_button.jump_mode = "click"
        yield submit_button

        yield Footer()

    def action_show_overlay(self) -> None:
        self.query_one(Jumper).show()

if __name__ == "__main__":
    MyApp().run()

How It Works

Single-Character Keys

For 8 or fewer widgets, each gets a single character:

Input Field 1  [a]
Input Field 2  [s]
Button         [d]

Press a to jump to Input Field 1.

Multi-Character Keys

For 9+ widgets, the system generates combinations with no conflicts:

Input 1   [a]     Input 5   [ha]    Input 9   [js]
Input 2   [s]     Input 6   [hs]    Input 10  [jd]
Input 3   [d]     Input 7   [hd]    Input 11  [jw]
Input 4   [w]     Input 8   [ja]

Smart allocation strategy ensures no conflicts between single and multi-character keys.

Jump Modes

Textual Jumper supports two jump modes for different widget interactions:

Focus Mode

Widgets with jump_mode = "focus" will receive focus when jumped to. This is ideal for input fields, text areas, and other widgets where you want to interact with them directly.

name_input = Input(placeholder="Name")
name_input.jump_mode = "focus"

Click Mode

Widgets with jump_mode = "click" will be clicked automatically when jumped to. This is perfect for buttons, links, and other widgets that trigger actions.

submit_button = Button("Submit")
submit_button.jump_mode = "click"

Configuration

Custom Key Mappings

jumper = Jumper(ids_to_keys={
    "username": "u",
    "password": "p",
    "submit": "s"
})

Custom Available Keys

jumper = Jumper(keys=["a", "s", "d", "f", "j", "k", "l", ";"])

Acknowledgments

Inspired by Darren Burns jump functionality in Posting.

Feedback and Issues

Feel free to reach out and share your feedback, or open an Issue, if something doesn't work as expected. Also check the Changelog for new updates.

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

textual_jumper-0.2.0.tar.gz (7.7 kB view details)

Uploaded Source

Built Distribution

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

textual_jumper-0.2.0-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file textual_jumper-0.2.0.tar.gz.

File metadata

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

File hashes

Hashes for textual_jumper-0.2.0.tar.gz
Algorithm Hash digest
SHA256 313674b4880d709b155fb2cf6fb750052cd133b72e5fd4c0ed16dcbc0a7d49dd
MD5 aeb60233f9778ff6c961553106cc1cc8
BLAKE2b-256 5e7bad75c7105992f3be3099f4224dcfbf19ac472e305cb35297741203b147d8

See more details on using hashes here.

Provenance

The following attestation bundles were made for textual_jumper-0.2.0.tar.gz:

Publisher: ci.yaml on Zaloog/textual-jumper

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

File details

Details for the file textual_jumper-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: textual_jumper-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 9.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for textual_jumper-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a2fc494148c4badad032f8b0189882f721565b9fb8503fda288070e96535f943
MD5 da03759a234ce32b5fe726910ea28478
BLAKE2b-256 c0f5664d0f46f8c7c42d9dae5a1b3fc6ee91902e31bcacdb781656cc41c62b09

See more details on using hashes here.

Provenance

The following attestation bundles were made for textual_jumper-0.2.0-py3-none-any.whl:

Publisher: ci.yaml on Zaloog/textual-jumper

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