{"id":50921985,"url":"https://github.com/shortarrow/runex","last_synced_at":"2026-06-16T19:01:46.020Z","repository":{"id":346100885,"uuid":"1186056773","full_name":"ShortArrow/runex","owner":"ShortArrow","description":"cross-shell abbreviation engine","archived":false,"fork":false,"pushed_at":"2026-05-31T06:50:31.000Z","size":2254,"stargazers_count":3,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-31T07:08:37.799Z","etag":null,"topics":["cli"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/runex","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ShortArrow.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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":"2026-03-19T08:13:02.000Z","updated_at":"2026-05-31T06:50:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ShortArrow/runex","commit_stats":null,"previous_names":["shortarrow/runex"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/ShortArrow/runex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShortArrow%2Frunex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShortArrow%2Frunex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShortArrow%2Frunex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShortArrow%2Frunex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ShortArrow","download_url":"https://codeload.github.com/ShortArrow/runex/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShortArrow%2Frunex/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34419350,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["cli"],"created_at":"2026-06-16T19:01:43.198Z","updated_at":"2026-06-16T19:01:45.805Z","avatar_url":"https://github.com/ShortArrow.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# runex\n\nEnglish | [日本語](docs/README.ja.md)\n\n\u003e Turn runes into commands.\n\nrunex is a cross-shell abbreviation engine that expands short tokens into full commands in real-time.\n\n![runex demo](https://raw.githubusercontent.com/ShortArrow/runex/main/docs/vhs/demo.gif)\n\n## Where to start\n\n| Goal | Read |\n|------|------|\n| Just install and try it | This README → [Install](docs/install.md) → [Setup](docs/setup.md) |\n| Find a config snippet for X | [docs/recipes.md](docs/recipes.md) |\n| Look up a field's exact meaning | [docs/config-reference.md](docs/config-reference.md) |\n| Diagnose \"I configured it but nothing happens\" | [docs/setup.md#troubleshooting](docs/setup.md#troubleshooting) |\n\n## Features\n\n- Cross-shell support (bash / zsh / pwsh / cmd / nushell)\n- Real-time expansion (customizable trigger key)\n- Single config file shared across shells\n- Conditional rules (`when_command_exists`) — only expand when the listed commands resolve in the current shell\n- Fast and lightweight (Rust core)\n\n## Concept\n\nrunex treats short inputs as **runes**, and expands them into full **casts**.\n\n```\ngcm␣ → git commit -m\nls␣  → lsd\n```\n\n## First expand in 5 minutes\n\n```bash\ncargo install runex                # 1. install\nrunex init                         # 2. create config + hook into your shell\n                                   #    (asks before touching your rcfile)\nexec $SHELL                        # 3. fresh shell so the integration loads\ngst\u003cSpace\u003e                         # 4. expands to: git status\n```\n\nThe config seeded by `runex init` includes a `gst → git status` sample\nso you can verify expansion works immediately. From there, swap in your\nown abbreviations — see [docs/recipes.md](docs/recipes.md) for\ncopy-pasteable patterns.\n\n## Install\n\n```bash\ncargo install runex                       # Rust toolchain\nbrew install shortarrow/runex/runex       # macOS / Linux\nparu -S runex-bin                         # Arch Linux (AUR)\nwinget install ShortArrow.runex           # Windows\n```\n\nOther options (mise, pre-built binaries, platform notes): see [docs/install.md](docs/install.md).\n\n## Setup\n\n`runex init` is **append-only and asks before each write** — your\nexisting rcfile is never modified except for one new block at the end.\nSee [What `runex init` will and won't do](docs/setup.md#what-runex-init-will-and-wont-do)\nfor the full guarantees.\n\nIt creates the config and appends the shell integration line to your rc file, with a confirmation prompt at each step:\n\n```\n$ runex init\nCreate config at ~/.config/runex/config.toml? [y/N] y\nCreated: ~/.config/runex/config.toml\nAppend shell integration to ~/.bashrc? [y/N] y\nAppended integration to ~/.bashrc\n```\n\nPass `-y` to skip all prompts. Per-shell manual setup (bash / zsh / pwsh / nu / clink) is documented in [docs/setup.md](docs/setup.md).\n\n## Config\n\nDefault path: `$XDG_CONFIG_HOME/runex/config.toml`, falling back to `~/.config/runex/config.toml` on all platforms.\n\nOverride with the `RUNEX_CONFIG` environment variable or the `--config` flag.\n\nNo keybindings are active until you configure them.\n\n```toml\nversion = 1\n\n[keybind.trigger]\ndefault = \"space\"\n\n[[abbr]]\nkey    = \"ls\"\nexpand = \"lsd\"\nwhen_command_exists = [\"lsd\"]\n\n[[abbr]]\nkey    = \"gcm\"\nexpand = \"git commit -m\"\n\n[[abbr]]\nkey    = \"gcam\"\nexpand = \"git commit -am '{}'\"   # {} = cursor stays here after expansion\n```\n\nSee [docs/config-reference.md](docs/config-reference.md) for the full reference, including evaluation order, fallback chains, and all accepted fields. For copy-pasteable scenarios (Git shortcuts, per-shell commands, fallback chains, …) see [docs/recipes.md](docs/recipes.md).\n\n## Commands\n\nThe five you'll reach for daily:\n\n```\nrunex init                       Set up config + shell integration (asks before each write)\nrunex doctor                     Verify everything is wired up\nrunex add \u003ckey\u003e \u003cexpand\u003e         Add an abbreviation rule to the config file\nrunex which \u003ctoken\u003e --why        Explain whether a token would expand and why\nrunex export \u003cshell\u003e             Print the shell integration script (sourced via init)\n```\n\nFull CLI reference: `runex --help` (or `runex \u003csubcommand\u003e --help` for a\nspecific one). Global flags `--config`, `--path-prepend`, and `--json`\nwork on every subcommand where they make sense; `--json` is supported by\n`list`, `doctor`, `version`, `expand`, `which`, and `timings`.\n\n`runex doctor` reports environment-level checks alongside config\nvalidation: `effective_search_path` (Windows-only PATH augmentation\nsummary) and `integration:\u003cshell\u003e` (rcfile-marker presence and clink lua\ndrift detection). The semantics for each row are spelled out in\n[`docs/config-reference.md`](docs/config-reference.md#runex-doctor--environment--integration-health),\nand [`docs/setup.md`](docs/setup.md) shows an annotated example.\n\n## Avoiding Expansion\n\nIf you use `trigger = \"space\"`, there are a few practical ways to avoid expansion:\n\n- In bash, prefix the token with `\\` — e.g. `\\ls` — or use `command ls`.\n- In PowerShell, `\\ls` is just a different token. For built-in aliases, prefer the full command name (e.g. `Get-ChildItem`).\n\nYou can also bind a key to plain-space insertion using `self_insert`:\n\n```toml\n[keybind.trigger]\ndefault = \"space\"\n\n[keybind.self_insert]\ndefault = \"shift-space\"   # pwsh/nu: Shift+Space inserts a space without expanding\n# default = \"alt-space\"   # all shells including bash/zsh\n```\n\n| Value | bash | zsh | pwsh | nu |\n|---|---|---|---|---|\n| `\"alt-space\"` | yes | yes | yes | yes |\n| `\"shift-space\"` | no | no | yes | yes |\n\n## Why not alias?\n\n| Feature           | alias | runex |\n| ----------------- | ----- | ----- |\n| Cross-shell       | No    | Yes   |\n| Real-time expand  | No    | Yes   |\n| Conditional rules | No    | Yes   |\n\n## Philosophy\n\n- One config, all shells\n- Minimal typing, maximal power\n- Runes over repetition\n\n## Roadmap\n\nNear-term:\n\n- Harden `doctor` and `init` around edge cases and clearer diagnostics\n\nLater:\n\n- Fuzzy suggestions\n- Interactive picker\n- Editor integrations\n- Broader distribution channels (GitHub Releases, `cargo-binstall`, `winget`, `mise github:`)\n\n## Name\n\n- **run** (execute)\n- **ex** (expand / execute)\n- **rune** (compressed command)\n- **run** + **ex** = expand / execute / express / extract / explode\n- **rune x** (like 7z's \"x\" for extract)\n- **rune +x** (like chmod's \"+x\" execute)\n\n## Acknowledgements\n\nrunex is inspired by [fish shell's abbreviation system](https://fishshell.com/docs/current/cmds/abbr.html) and [zsh-abbr](https://github.com/olets/zsh-abbr). The idea of real-time token expansion originated there — runex brings it to every shell with a single config file.\n\n## License\n\nDual-licensed under either of [MIT](LICENSE) or [Apache-2.0](LICENSE) at your option. Unless explicitly stated otherwise, any contribution intentionally submitted for inclusion in this work by you shall be dual-licensed as above, without any additional terms or conditions.\n\nThird-party dependency licenses are documented in [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshortarrow%2Frunex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshortarrow%2Frunex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshortarrow%2Frunex/lists"}