{"id":46840347,"url":"https://github.com/halfrgrd/flyline","last_synced_at":"2026-04-24T00:01:29.725Z","repository":{"id":336000547,"uuid":"1085316918","full_name":"HalFrgrd/flyline","owner":"HalFrgrd","description":"Flyline: a Bash plugin to replace readline for a modern line editing experience: syntax highlighting, agent integration, rich prompts, tooltips, fuzzy history search, and more!","archived":false,"fork":false,"pushed_at":"2026-04-23T22:45:50.000Z","size":1693,"stargazers_count":4,"open_issues_count":15,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-23T23:29:38.389Z","etag":null,"topics":["bash","bash-plugin","line-editor","rust","terminal"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HalFrgrd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-28T21:53:04.000Z","updated_at":"2026-04-23T22:40:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/HalFrgrd/flyline","commit_stats":null,"previous_names":["halfrgrd/flyline"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/HalFrgrd/flyline","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HalFrgrd%2Fflyline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HalFrgrd%2Fflyline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HalFrgrd%2Fflyline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HalFrgrd%2Fflyline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HalFrgrd","download_url":"https://codeload.github.com/HalFrgrd/flyline/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HalFrgrd%2Fflyline/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32203362,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-23T20:19:26.138Z","status":"ssl_error","status_checked_at":"2026-04-23T20:19:23.520Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","bash-plugin","line-editor","rust","terminal"],"created_at":"2026-03-10T12:40:13.729Z","updated_at":"2026-04-24T00:01:29.718Z","avatar_url":"https://github.com/HalFrgrd.png","language":"Rust","readme":"# Flyline\n\n\u003cdiv align=\"center\"\u003e\n\n[![CI](https://github.com/HalFrgrd/flyline/actions/workflows/ci.yml/badge.svg)](https://github.com/HalFrgrd/flyline/actions/workflows/ci.yml)\n[![License](https://img.shields.io/github/license/HalFrgrd/flyline)](https://github.com/HalFrgrd/flyline/blob/master/LICENSE)\n[![Latest Release](https://img.shields.io/github/v/release/HalFrgrd/flyline)](https://github.com/HalFrgrd/flyline/releases)\n\n**A Bash plugin for modern command line editing.**\n\n\n![Demo](https://github.com/HalFrgrd/flyline/releases/download/assets/demo_overview.gif)\n\n\u003c/div\u003e\n\nWhen Bash prompts you for a command, a library called [readline](https://www.gnu.org/software/bash/manual/html_node/Command-Line-Editing.html) handles your keystrokes. Readline lacks many features users have come to expect. Flyline is a readline replacement that provides an enhanced line editing experience with:\n- Undo and redo support\n- [Agent assisted command writing](#agent-mode)\n- [Rich prompt customizations, (asynchronous) widgets, animations](#rich-prompts)\n- [Fuzzy history searching](#command-history)\n- [Mouse support](#mouse-support)\n- [Improvements to Bash's tab completion](#tab-completion-improvements)\n- Tooltips\n- Auto close brackets and quotes\n- Syntax highlighting\n- Runs in the same process as Bash\n- Cursor animations and styles\n\nFlyline is similar to [ble.sh](https://github.com/akinomyoga/ble.sh) but is written in Rust and uses [ratatui.rs](https://ratatui.rs/) to more easily draw complex user interfaces.\n\n### Who is it for?\n1. You want an out-of-the-box great shell experience without the hassle of setting up half a dozen plugins, plugin managers, keyboard shortcuts, and startup scripts (anyone of which might phone home).\n2. You're a terminal power user who wants to fine tune their shell experience by writing in a modern language like Rust. Flyline can be the starting platform for you; contributions welcome!\n\n# Installation\n\nTo install flyline, you need to:\n1. Acquire `libflyline.so`\n2. Run `enable -f /path/to/libflyline.so flyline` (preferably in your `.bashrc`)\n3. Optional but recommended: `flyline run-tutorial`\n\nFrom easiest to hardest:\n\n### Quick install: run `install.sh`\n\n\u003e [!TIP]\n\u003e Quick install:\n\u003e run the following command to automatically download and set your `.bashrc` to run the latest flyline version:\n```bash\ncurl -sSfL https://raw.githubusercontent.com/HalFrgrd/flyline/master/install.sh | sh\n```\n\n\n### Download from releases\n\nDownload the latest `libflyline.so` for your system from [the releases page](https://github.com/HalFrgrd/flyline/releases). If you are on Linux, you probably want the `gnu` variant unless you know you are on a `musl` based Linux distro (e.g. Alpine, Chimera).\nThen, in your `.bashrc` (or in your current Bash session):\n```bash\nenable -f /path/to/libflyline.so flyline\nflyline run-tutorial\n```\n\n\n### Build from source\n\nClone the repo and run:\n```bash\ncargo build\nenable -f /path/to/flyline_checkout/target/debug/libflyline.so flyline\n```\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eInstallation notes\u003c/strong\u003e\u003c/summary\u003e\n\nDisable flyline with `enable -d flyline`.\n\n#### BASH_LOADABLES_PATH\n\nTaken from https://www.gnu.org/software/bash/manual/bash.html:\n\n\u003e The -f option means to load the new builtin command name from shared object filename, on systems that support dynamic loading. If filename does not contain a slash, Bash will use the value of the BASH_LOADABLES_PATH variable as a colon-separated list of directories in which to search for filename. The default for BASH_LOADABLES_PATH is system-dependent, and may include \".\" to force a search of the current directory.\n\nBash 4.4 introduced `BASH_LOADABLES_PATH`\nBash 5.2-alpha added a default value for `BASH_LOADABLES_PATH`.\nCheck your Bash version with: `bash --version`\n\nSo on Bash at least as recent as 5.2, if you install flyline to one of:\n- /opt/local/lib/bash\n- /opt/pkg/lib/bash\n- /usr/lib/bash\n- /usr/local/lib/bash\n- /usr/pkg/lib/bash\n\nThen you can simply run `enable flyline`.\n\n\u003c/details\u003e\n\n# Configuration\n\nFlyline sets up its own tab completion\nso you can type `flyline \u003cTab\u003e` in your shell to interactively browse and configure settings. Copy the commands into your `.bashrc` so they persist.\n\nExplore this readme and [examples](examples/) for what you can configure.\n\n# Rich prompts\n\nFlyline supports dynamic content in `PS1`, `RPS1` / `RPROMPT`, and `PS1_FILL`.\n\n## PS1\nThe `PS1` environment variable sets the left prompt just like normal. See [Bash prompt documentation](https://www.gnu.org/software/bash/manual/html_node/Controlling-the-Prompt.html), [Arch Linux wiki](https://wiki.archlinux.org/title/Bash/Prompt_customization), or [Starship ](https://starship.rs/) for more information.\n![PS1 demo](https://github.com/HalFrgrd/flyline/releases/download/assets/demo_prompts_ps1.gif)\n```bash\nPS1='\\u@\\h:\\w$ '\nPS1='\\u@\\h:\\w\\n$ '\nPS1='\\e[01;32m\\u@\\h\\e[00m:\\e[01;34m\\w\\e[00m\\n$ '\n```\n\n\u003e [!TIP]\n\u003e Do git metrics slow down your prompt loading time? See [custom widget](#custom-command-widget) or [example widgets](examples/widgets.sh) for a solution.\n\n## RPS1 / RPROMPT\nThe `RPS1` / `RPROMPT` variable sets the right prompt similarly to Zsh.\n![RPS1 demo](https://github.com/HalFrgrd/flyline/releases/download/assets/demo_prompts_rps1.gif)\n```bash\nRPS1='\\t'\nRPS1='\\t\\n\u003c'\nRPS1='\\e[01;33m\\t\\n\u003c\\e[00m'\n```\n\n## PS1_FILL\n`PS1_FILL` fills the gap between the `PS1` and `RPS1` lines.\n![PS1_FILL demo](https://github.com/HalFrgrd/flyline/releases/download/assets/demo_prompts_ps1_fill.gif)\n```bash\nPS1_FILL='-'\nPS1_FILL='🯁🯂🯃🮲🮳' # finger pointing to running man\nPS1_FILL='🯁🯂🯃🮲🮳 \\D{%.3f}'\n```\n\n## Dynamic time in prompts\n\nFlyline recognises the standard Bash time escape sequences and re-evaluates them on every prompt draw, so the time shown is always current:\n\n| Sequence       | Output                          |\n|----------------|---------------------------------|\n| `\\t`           | 24-hour time — `HH:MM:SS`       |\n| `\\T`           | 12-hour time — `HH:MM:SS`       |\n| `\\@`           | 12-hour time with am/pm         |\n| `\\A`           | 24-hour time — `HH:MM`          |\n| `\\D{format}`   | Custom format (see below)       |\n\nThese can be placed in any of the supported prompt variables:\n\n```bash\n# Right prompt showing 24-hour time in green\nRPS1='\\e[01;32m\\t\\e[0m'\n\n# Right prompt showing 12-hour am/pm time\nRPS1='\\e[01;34m\\@\\e[0m'\n```\n\n### Custom time format with `\\D{format}`\n\nUse `\\D{format}` with any [Chrono format string](https://docs.rs/chrono/latest/chrono/format/strftime/index.html) to display the time exactly how you want it. This is similar to `\\D{format}` in the [Bash prompt documentation](https://www.gnu.org/software/bash/manual/html_node/Controlling-the-Prompt.html), but the format string is interpreted by Chrono rather than strftime.\n\n```bash\n# Show date and time\nRPS1='\\e[01;32m\\D{%Y-%m-%d %H:%M:%S}\\e[0m'\n\n# Show only hours and minutes\nRPS1='\\D{%H:%M}'\n```\n\n\n\n## Custom prompt widgets\n\nCreate custom prompt widgets with `flyline create-prompt-widget`.\nFlyline will replace strings in the prompt matching the widget name with the widget's output.\n\n### Animations\n\nCreate your own animations with `flyline create-prompt-widget animation --name [your animation name here] [FRAMES]`.\nFlyline will replace strings in the prompt matching the animation name with the animation:\n\n![Custom animation demo](https://github.com/HalFrgrd/flyline/releases/download/assets/demo_custom_animation.gif)\n\nMore examples can be found in [examples/animations.sh](examples/animations.sh).\n\nThe block below is auto-generated from `flyline create-prompt-widget animation --help`:\n\n\u003c!-- FLYLINE_CREATE_PROMPT_WIDGET_ANIMATION_HELP_START --\u003e\n```\nCreate a custom prompt animation that cycles through frames.\n\nInstances of NAME in prompt strings (PS1, RPS1, PS1_FILL) are replaced\nwith the current animation frame on every render.  Frames may include\nANSI colour sequences written as `\\e` (e.g. `\\e[33m`).\n\nExamples:\n  flyline create-prompt-widget animation --name \"MY_ANIMATION\" --fps 10  ⣾ ⣷ ⣯ ⣟ ⡿ ⢿ ⣻ ⣽\n  flyline create-prompt-widget animation --name \"john\" --ping-pong --fps 5  '\\e[33m\\u' '\\e[31m\\u' '\\e[35m\\u' '\\e[36m\\u'\n\nSee https://github.com/HalFrgrd/flyline/blob/master/examples/animations.sh for more details and example usage.\n\nUsage: flyline create-prompt-widget animation [OPTIONS] --name \u003cNAME\u003e [FRAMES]...\n\nArguments:\n  [FRAMES]...\n          One or more animation frames (positional).  Use `\\e` for the ESC character\n\nOptions:\n      --name \u003cNAME\u003e\n          Name to embed in prompt strings as the animation placeholder\n\n      --fps \u003cFPS\u003e\n          Playback speed in frames per second (default: 10)\n          \n          [default: 10]\n\n      --ping-pong\n          Reverse direction at each end instead of wrapping (ping-pong / bounce mode)\n\n  -h, --help\n          Print help (see a summary with '-h')\n```\n\u003c!-- FLYLINE_CREATE_PROMPT_WIDGET_ANIMATION_HELP_END --\u003e\n\n### Mouse-mode widget\n\nThe block below is auto-generated from `flyline create-prompt-widget mouse-mode --help`:\n\n\u003c!-- FLYLINE_CREATE_PROMPT_WIDGET_MOUSE_MODE_HELP_START --\u003e\n```\nShow different text depending on whether mouse capture is enabled.\n\nInstances of NAME in prompt strings (PS1, RPS1, PS1_FILL) are replaced\nwith ENABLED_TEXT when mouse capture is on, and DISABLED_TEXT when off.\n\nExamples:\n  flyline create-prompt-widget mouse-mode --name FLYLINE_MOUSE_MODE '🖱️' '🔴'\n  # Now use FLYLINE_MOUSE_MODE in your prompt:\n  PS1='\\u@\\h:\\w [FLYLINE_MOUSE_MODE] $ '\n\n  flyline create-prompt-widget mouse-mode --name MOUSE_MODE \"on \" \"off\"\n\nUsage: flyline create-prompt-widget mouse-mode --name \u003cNAME\u003e \u003cENABLED_TEXT\u003e \u003cDISABLED_TEXT\u003e\n\nArguments:\n  \u003cENABLED_TEXT\u003e\n          Text to display when mouse capture is enabled\n\n  \u003cDISABLED_TEXT\u003e\n          Text to display when mouse capture is disabled\n\nOptions:\n      --name \u003cNAME\u003e\n          Name to embed in prompt strings as the widget placeholder\n\n  -h, --help\n          Print help (see a summary with '-h')\n```\n\u003c!-- FLYLINE_CREATE_PROMPT_WIDGET_MOUSE_MODE_HELP_END --\u003e\n\n### Custom command widget\n\nThe block below is auto-generated from `flyline create-prompt-widget custom --help`:\n\n\u003c!-- FLYLINE_CREATE_PROMPT_WIDGET_CUSTOM_HELP_START --\u003e\n```\nRun a shell command and display its output in the prompt.\n\nThe output is passed through Bash's decode_prompt_string so Bash prompt\nescape sequences (e.g. \\u, \\w, ANSI colour codes) are fully supported.\n\nExamples:\n  # Non-blocking (default): runs in the background; shows the previous output\n  # while the command is running (empty on the first render).\n  flyline create-prompt-widget custom --name CUSTOM_WIDGET1 --command 'run_slow_git_metrics.sh'\n  # PS1 usage:\n  PS1='\\u@\\h:\\w [CUSTOM_WIDGET1] $ '\n\n  # Non-blocking with a 10-space placeholder while the new output is being computed.\n  flyline create-prompt-widget custom --name CUSTOM_WIDGET1 --command 'run_slow_git_metrics.sh' --placeholder 10\n\n  # Blocking: waits for the command to finish before showing the prompt.\n  flyline create-prompt-widget custom --name CUSTOM_WIDGET2 --command 'run_something.sh' --block\n\n  # Blocking with a 500 ms timeout; falls back to placeholder if slower.\n  flyline create-prompt-widget custom --name CUSTOM_WIDGET3 --command 'run_slow.sh --flag' --block 500 --placeholder prev\n\nUsage: flyline create-prompt-widget custom [OPTIONS] --name \u003cNAME\u003e --command \u003cCOMMAND\u003e\n\nOptions:\n      --name \u003cNAME\u003e\n          Name to embed in prompt strings as the widget placeholder\n\n      --command \u003cCOMMAND\u003e\n          Command string to run; include any flags in the same string, e.g. --command './widget.sh --someflag'\n\n      --block [\u003cMS\u003e]\n          Block until the command finishes, optionally with a timeout in milliseconds. With no value, polls indefinitely (i32::MAX ms ≈ 24.8 days).  If the timeout expires the command continues running in the background and subsequent renders will pick up its output\n\n      --placeholder \u003cPLACEHOLDER\u003e\n          What to show while the command is running.  Either a number (spaces) or 'prev' (use the previous output of the command)\n\n  -h, --help\n          Print help (see a summary with '-h')\n```\n\u003c!-- FLYLINE_CREATE_PROMPT_WIDGET_CUSTOM_HELP_END --\u003e\n\n\n# Agent mode\nFlyline can interact with your AI agent to suggest commands.\nThis allows you to write a command in plain English and your agent will convert it into a Bash command:\n\n![Agent mode demo](https://github.com/HalFrgrd/flyline/releases/download/assets/demo_agent_mode.gif)\n\nAfter setting up your agent with flyline, you can pass the buffer to your agent with Alt+Enter or simply Enter when your command starts with your trigger prefix (e.g. `ai: list files older than three days`).\n\n[See the examples on how to set this up.](examples/agent_mode.sh) or simply press Alt+Enter and flyline will try to configure agent mode for you.\n\nFlyline will syntax highlight the suggested commands and render markdown output.\n\n# Mouse support\n\nClick to move your cursor, select suggestions, and hover for tooltips.\nFlyline must capture mouse events for the entire terminal which isn't always desirable.\nFor instance, you might want to select text above the current prompt with your mouse.\n\nFlyline offers three mouse modes:\n- `disabled`: Never capture mouse events\n- `simple`: Mouse capture is on by default; toggled when Escape is pressed\n- `smart` (default): Mouse capture is on by default with automatic management: disabled on scroll or when the user clicks above the viewport, re-enabled on any keypress or when focus is regained\n\nI'd recommend [setting up a mouse mode widget](#mouse-mode-widget) to know when mouse capture is enabled.\n\n# Tab completion improvements\nFlyline extends Bash's tab completion feature in many ways.\nNote that you will need to have [set up completions in normal Bash first](https://github.com/scop/bash-completion).\n\n### Fuzzy tab completions\nWhen you're presented with suggestions, you can type to fuzzily search through the list:\n\n![Fuzzy suggestions demo](https://github.com/HalFrgrd/flyline/releases/download/assets/demo_fuzzy_suggestions.gif)\n\n### Alias expansion\nAliases are expanded before attempting tab completion so that Bash calls the desired completion function.\nFor instance, if `gc` aliases to `git commit`, `gc --verbo\u003cTab\u003e` will work as expected.\n\n### Nested command contexts\nFlyline supports tab completions inside subshell, command substitution, and process substitution expressions.\nFor instance, `ls $(grep --\u003cTab\u003e)` calls `grep`'s tab completion logic if it's set up.\n\n### Mid-word tab completions\nWhen your cursor is midway through a word and you press tab (e.g. `grep --i\u003cTab\u003envrte`), the left-hand side will be used in the programmable completion function but the suggestions will be fuzzily searched using the entire word.\n\n### Dynamic descriptions\nIf a suggestion contains a tab character, flyline displays the contents after the tab as a description. If there are multiple tab characters, flyline will animate each tab-delimited frame at 24fps. Try `flyline set-cursor --interpolate-easing \u003cTab\u003e` for an example.\n\u003c!-- This demo requires a smooth frame which the github runner recording it does not deliver. Hiding it for now since it deserves better.--\u003e\n\u003c!-- ![Tab completion easing demo](https://github.com/HalFrgrd/flyline/releases/download/assets/demo_tab_completion_easing.gif) --\u003e\n\nANSI styling is supported in descriptions: any ANSI colour/style escape codes embedded in the tab-separated description text will be rendered as ratatui styled spans.\n\nDescriptions for files are the time since last modified.\n\n### Automatically complete based on `--help`\nComing soon: Automatically generate a completion spec for commands without one.\nFor now, you can manually generate a Bash completion script with `flyline comp-spec-synthesis your_command`.\n\n### `LS_COLORS` styling\nFlyline styles your filename tab completion results according to `$LS_COLORS`:\n\n![LS_COLORS demo](https://github.com/HalFrgrd/flyline/releases/download/assets/demo_ls_colors.gif)\n\n\n# Command history\n\n**Fuzzy history search:**\nFlyline offers a fuzzy history search similar to fzf or skim accessed with `Ctrl+R`:\n\n![Fuzzy history demo](https://github.com/HalFrgrd/flyline/releases/download/assets/demo_fuzzy_history.gif)\n\n**Inline suggestions:**\nInline suggestions appear as you type based on the most recent matching history entry. Accept them by moving your cursor to the end of the line and pressing `Right`/`End`.\n\n**Scroll through prefix matches:**\nPressing `Up` will scroll through history entries that are a prefix match with the current command.\n\n**Zsh history entries:**\nOptionally read Zsh history entries to make migrating to Bash easier.\n\n# Terminal emulator notes\n## VS Code:\nRecommended settings\n- [`terminal.integrated.minimumContrastRatio = 1`](vscode://settings/terminal.integrated.minimumContrastRatio) to prevent the cell's foreground colour changing when it's under the cursor.\n- You may want to set [`terminal.integrated.macOptionIsMeta`](vscode://settings/terminal.integrated.macOptionIsMeta) so `Option+\u003cKEY\u003e` shortcuts are properly recognised.\n- Enable [`terminal.integrated.enableKittyKeyboardProtocol`](vscode://settings/terminal.integrated.enableKittyKeyboardProtocol) so that the integrated terminal [correctly forwards keystrokes to flyline](https://code.visualstudio.com/updates/v1_109#_new-vt-features). You will need to set [`workbench.settings.alwaysShowAdvancedSettings = 1`](vscode://settings/workbench.settings.alwaysShowAdvancedSettings) to find this setting.\n- Enable [`terminal.integrated.textBlinking`](vscode://terminal.integrated.textBlinking). Few terminal emulators support this neat text style option so enjoy it!\n- If keybindings are not working properly, you can debug by [Toggling Keyboard Shortcuts Troubleshooting](https://code.visualstudio.com/docs/configure/keybindings#_troubleshooting-keyboard-shortcuts).\n\nI find that Copilot can't interact with the terminal if flyline runs with certain settings. If you run into this problem, add this to the end of your `.bashrc`:\n```bash\nif [[ -n \"${COPILOT_TERMINAL:-}\" ]]; then\n    RPS1=''\n    flyline set-cursor --backend terminal --interpolate none\n    flyline --show-inline-history false\nfi\n``` \nand set this in your `settings.json`:\n```json\n  \"chat.tools.terminal.terminalProfile.linux\": {\n    \"env\": {\n      \"COPILOT_TERMINAL\": \"1\"\n    },\n    \"path\": \"bash\",\n  }\n```\n\n## macOS\n\n`Command+\u003cKEY\u003e` shortcuts are often captured by the terminal emulator and not forwarded to the shell.\nTwo possible fixes are:\n- Map `Command+\u003cKEY\u003e` to `Control+\u003cKEY\u003e` in your terminal emulator settings.\n- Use a terminal emulator that supports [Kitty's extended keyboard protocol](https://sw.kovidgoyal.net/kitty/keyboard-protocol/). This allows flyline to receive `Command+\u003cKEY\u003e` events.\n\n## Shell integration\nFlyline prints [OSC 133](https://sw.kovidgoyal.net/kitty/shell-integration/#notes-for-shell-developers) and [OSC 633](https://code.visualstudio.com/docs/terminal/shell-integration#_supported-escape-sequences) escape codes to integrate the shell with the terminal. These are on by default and can be disabled with `flyline --send-shell-integration-codes none`.\n\n# Settings\n\nThe block below is auto-generated from `flyline --help`:\n\n\u003c!-- FLYLINE_HELP_START --\u003e\n```\nUsage: flyline [OPTIONS] [COMMAND]\n\nCommands:\n  set-agent-mode        Configure AI agent mode.\n  create-prompt-widget  Create a custom prompt widget.\n  set-colour            Configure the colour palette.\n  set-cursor            Configure the cursor appearance and animation.\n  key                   Manage keybindings.\n  log                   Logging commands: dump, configure level, or stream logs.\n  run-tutorial          Run the interactive tutorial for first-time users.\n  comp-spec-synthesis   Run a command with --help, parse the output, and print a Bash completion\n                        script to stdout.\n  help                  Print this message or the help of the given subcommand(s)\n\nOptions:\n      --version\n          Show version information\n\n      --load-zsh-history [\u003cPATH\u003e]\n          Load Zsh history in addition to Bash history. Optionally specify a PATH to the Zsh history file\n\n      --show-animations [\u003cSHOW_ANIMATIONS\u003e]\n          Show animations\n          \n          [possible values: true, false]\n\n      --show-inline-history [\u003cSHOW_INLINE_HISTORY\u003e]\n          Show inline history suggestions\n          \n          [possible values: true, false]\n\n      --auto-close-chars [\u003cAUTO_CLOSE_CHARS\u003e]\n          Enable automatic closing character insertion (e.g. insert `)` after `(`)\n          \n          [possible values: true, false]\n\n      --matrix-animation [\u003cMATRIX_ANIMATION\u003e]\n          Run matrix animation in the terminal background. Use `on` to always show it, `off` to disable it, or an integer number of seconds to show it after that many seconds of inactivity (no keypress or mouse event). Defaults to `off`; passing the flag without a value is equivalent to `on`\n\n      --frame-rate \u003cFPS\u003e\n          Render frame rate in frames per second (1–120, default 24)\n\n      --mouse-mode \u003cMODE\u003e\n          Mouse capture mode (disabled, simple, smart). Default is smart\n\n          Possible values:\n          - disabled: Never capture mouse events\n          - simple:   Mouse capture is on by default; toggled when Escape is pressed\n          - smart:    Mouse capture is on by default with automatic management: disabled on scroll or when the user clicks above the viewport, re-enabled on any keypress or when focus is regained\n\n      --send-shell-integration-codes [\u003cSEND_SHELL_INTEGRATION_CODES\u003e]\n          Send shell integration escape codes (OSC 133 / OSC 633): none, only-prompt-pos, or full\n\n          Possible values:\n          - none:            Send no shell integration codes\n          - only-prompt-pos: Only send the escape codes that report prompt start/end positions\n          - full:            Send the full set of shell integration codes: prompt positions, execution start/end codes, and cursor-position reporting\n\n      --enable-extended-key-codes [\u003cENABLE_EXTENDED_KEY_CODES\u003e]\n          Whether to request the use of extended (kitty-protocol) keyboard codes during startup. Enabled by default; pass `--enable-extended-key-codes false` to disable it on terminals that misbehave when the request is sent\n          \n          [possible values: true, false]\n\n  -h, --help\n          Print help (see a summary with '-h')\n\nRead more at https://github.com/HalFrgrd/flyline\n```\n\u003c!-- FLYLINE_HELP_END --\u003e\n\n\n## Colour palette\n\nFlyline ships with two built-in colour presets (dark and light) and lets you override individual colours.\n\n### Presets\n\n```bash\nflyline set-colour --default-theme dark   # original palette, optimised for dark terminals\nflyline set-colour --default-theme light  # preset optimised for light terminals\n```\n\n### Custom colours\n\nStyle strings follow the [rich](https://rich.readthedocs.io/en/stable/style.html) syntax: a\nspace-separated list of attributes and colours.\n\nSupported attributes: `bold`, `dim`, `italic`, `underline`, `blink`, `reverse`, `strike`.\n\nColours can be specified by name (`red`, `green`, `blue`, `magenta`, `cyan`, `yellow`,\n`white`, `black`, `bright_red`, …), as a 256-colour index (`color(196)`), or as an RGB\nhex code (`#ff5500`) or `rgb(r,g,b)` form.\n\n```bash\nflyline set-colour --inline-suggestion \"dim italic\"\nflyline set-colour --default-theme light --matching-char \"bold blue\"\nflyline set-colour --recognised-command \"green\" --unrecognised-command \"bold red\"\nflyline set-colour --secondary-text \"dim\" --tutorial-hint \"bold italic\"\n```\n\n## Keybindings\n\nList all keybindings with `flyline key list`.\nFlyline allows configurable keybindings with the `flyline key set [KEY SEQUENCE] [SCOPED ACTION]` subcommand.\nCertain actions are only possible in certain scopes.\nThis allows a key sequence to trigger different actions under different circumstances.\n\nFor instance:\n```bash\nflyline key set Enter default::submit_or_newline\nflyline key set Enter tab_completion::accept_entry        # defined last -\u003e higher priority\n```\nWhen you press `Enter`, flyline will accept the tab completion entry if the `tab_completion` scope is active (i.e. if you are currently browsing tab completion suggestions).\nIf the `tab_completion` scope is not active, then it will try the next keybinding for `Enter` and run that action if the scope is active.\nThe `default` is always active.\n\nIt is possible to remap keys entirely with:\n```bash\nflyline key remap Alt Ctrl       # Pressing Alt now acts like pressing Ctrl\nflyline key remap Ctrl Alt       # With the above command, Alt and Ctrl are effectively swapped.\n```\n\nTab completions exist for both key sequences and actions to make it easier to write keybindings.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhalfrgrd%2Fflyline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhalfrgrd%2Fflyline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhalfrgrd%2Fflyline/lists"}