whi
whi is a smarter which that also lets you rearrange your current shell's PATH safely. Install the shell integration once, run the high level commands (prefer, move, switch, clean, delete, undo, redo, reset, diff, apply, save, load), and grab the helper shortcuts if you like terse aliases.
Heads up: mutation commands only run after the integration exports
WHI_SHELL_INITIALIZED=1. If you see the integration warning, run the snippet for your shell and add it to your config for persistence.
Install & Integrate
Pick the snippet for your shell and paste it into a terminal. Add the same line to the END of your shell config so it runs on startup after all PATH modifications.
# Bash
# Zsh
# Fish
| # add to the END of ~/.config/fish/config.fish
Important: The integration must be at the END of your config so whi captures your final PATH after all modifications (homebrew, cargo, etc.).
The snippet:
- Loads any previously saved PATH (from
~/.whi/saved_path_*) - Defines helper functions (
whip,whim,whis,whiu,whir,whil, etc.) - Exports
WHI_SHELL_INITIALIZED=1sowhiknows it's safe to mutate PATH - Captures the final PATH as your session baseline for undo/diff tracking
Core Commands
All of these operate on the current shell session. Each command prints the updated PATH; the integration captures the string and updates PATH for you.
# Which like usage
# Show full path (line separated)
# Prefer a specific executable or add a path
# Makes the minimal required change to path / puts it at
# the lowest spot in path that achieves it being the winner
# Move and swap entries by index (1-based)
# Clean duplicates
# Delete entries
# Undo/redo/reset PATH changes
# Inspect PATH changes
# Persist PATH to shell config files
# Profile management
Querying executables
# This is cool ... list all matches, newline, list full path
# with all path entries containing the binary highlighted
Useful flags:
-a/--all-f/--full-l/--follow-symlinks-s/--stat-0/--print0-q/--quiet--silent--color <auto|never|always>--path <PATH>
whi --help shows the verbs (prefer, move, switch, clean, delete, undo, redo, reset, diff, apply, save, load, list, rmp). The integration intercepts those public names and rewrites them to the hidden __… subcommands that actually mutate the environment.
Helper Shortcuts
These are defined by the integration and map directly to the core commands:
Use whichever spelling you prefer—both routes converge in Rust.
Persistence & State
-
Saved PATH files live in
~/.whi/(saved_path_bash,saved_path_zsh,saved_path_fish).whi apply allwrites to all three. Each save creates a*.bakbackup before overwriting. -
Profile storage lives in
~/.whi/profiles/. Each profile is a file containing a colon-separated PATH string. Usewhi save <name>to save current PATH as a profile,whi load <name>to restore it, andwhi listto see all profiles. -
Session snapshots live in
${XDG_RUNTIME_DIR:-/tmp}/whi-<uid>/session_<ppid>.log. Each PATH modification writes a snapshot (timestamp + full PATH string). The undo/redo system navigates through these snapshots with a cursor. Sessions keep up to 500 snapshots (initial + last 499) and auto-cleanup old sessions after 24 hours. -
Undo cursor lives in
${XDG_RUNTIME_DIR:-/tmp}/whi-<uid>/session_<ppid>.cursor. Tracks your position in the snapshot history. No cursor file means you're at the latest state.
How undo/redo works
Every PATH mutation writes a snapshot. The undo system navigates backwards through snapshots, and redo moves forward. If you undo then make a new change, the "future" timeline is discarded (standard undo/redo behavior).
# Example session:
whi diff compares your current PATH to the initial session snapshot, so it shows all changes including manual export PATH=... modifications (not just whi operations).
Notes
-
Mutating commands exit with an instructional message if the integration is missing. Copy the snippet shown, run it, and add it to your shell config for future sessions.
-
Profile loading includes self-protection: if a profile doesn't contain the current
whidirectory, it's silently appended to prevent losing access towhiitself. -
If you want to script against
whidirectly, capture stdout and export the string yourself. The integration just automates that for interactive use.
License
MIT