A keyboard-driven navigation widget for Textual TUI applications
Project description
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
- 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
313674b4880d709b155fb2cf6fb750052cd133b72e5fd4c0ed16dcbc0a7d49dd
|
|
| MD5 |
aeb60233f9778ff6c961553106cc1cc8
|
|
| BLAKE2b-256 |
5e7bad75c7105992f3be3099f4224dcfbf19ac472e305cb35297741203b147d8
|
Provenance
The following attestation bundles were made for textual_jumper-0.2.0.tar.gz:
Publisher:
ci.yaml on Zaloog/textual-jumper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
textual_jumper-0.2.0.tar.gz -
Subject digest:
313674b4880d709b155fb2cf6fb750052cd133b72e5fd4c0ed16dcbc0a7d49dd - Sigstore transparency entry: 622862895
- Sigstore integration time:
-
Permalink:
Zaloog/textual-jumper@b6c6abfdaf2e8e636a9da668ae428b776461e3eb -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Zaloog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@b6c6abfdaf2e8e636a9da668ae428b776461e3eb -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a2fc494148c4badad032f8b0189882f721565b9fb8503fda288070e96535f943
|
|
| MD5 |
da03759a234ce32b5fe726910ea28478
|
|
| BLAKE2b-256 |
c0f5664d0f46f8c7c42d9dae5a1b3fc6ee91902e31bcacdb781656cc41c62b09
|
Provenance
The following attestation bundles were made for textual_jumper-0.2.0-py3-none-any.whl:
Publisher:
ci.yaml on Zaloog/textual-jumper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
textual_jumper-0.2.0-py3-none-any.whl -
Subject digest:
a2fc494148c4badad032f8b0189882f721565b9fb8503fda288070e96535f943 - Sigstore transparency entry: 622862898
- Sigstore integration time:
-
Permalink:
Zaloog/textual-jumper@b6c6abfdaf2e8e636a9da668ae428b776461e3eb -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Zaloog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@b6c6abfdaf2e8e636a9da668ae428b776461e3eb -
Trigger Event:
push
-
Statement type: