README.md
August 2, 2026 · View on GitHub
██████╗ ██╗████████╗ ███████╗██╗ ██╗███████╗███████╗██╗ ██╗
██╔════╝ ██║╚══██╔══╝ ██╔════╝██║ ██║╚══███╔╝╚══███╔╝╚██╗ ██╔╝
██║ ███╗██║ ██║█████╗█████╗ ██║ ██║ ███╔╝ ███╔╝ ╚████╔╝
██║ ██║██║ ██║╚════╝██╔══╝ ██║ ██║ ███╔╝ ███╔╝ ╚██╔╝
╚██████╔╝██║ ██║ ██║ ╚██████╔╝███████╗███████╗ ██║
╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚══════╝ ╚═╝
[FULL-SCREEN FZF GIT UI — COMPILED]
"a self-reentrant fzf UI with no per-keystroke re-sourcing."
[NATIVE ZSHRS PLUGIN]
git-fuzzy — the full-screen fzf-driven git interface — ported to a native zshrs plugin. This port covers the status command end-to-end.
zshrs · znative · upstream
Table of Contents
[0x00] OVERVIEW
git-fuzzy is a self-reentrant fzf UI: every preview and keybinding calls back into the tool. In bash that re-execs the script and re-sources its library per keystroke (git-fuzzy even ships "dispatch-aware sourcing" to make that cheap). As a compiled plugin, the helpers are builtins — no per-keystroke library sourcing.
Requires git and fzf (>= 0.71) on PATH. delta / diff-so-fancy are used for diff rendering when present.
[0x01] INSTALL
znative load MenkeTechnologies/zshrs-git-fuzzy
Put that one line in your .zshrc. znative, zshrs's package manager, installs the plugin on the first shell start — clones it, runs cargo build --release, and zmodload -Rs the resulting libgit_fuzzy — then loads it from the store, zero-network, on every start after. No separate install step.
Manual build
cargo build --release
zmodload -R ./target/release/libgit_fuzzy.dylib # .so on Linux
gf status
[0x02] COMMANDS
| command | what it does |
|---|---|
gf status | interactive git status UI |
gf / gf menu | same as gf status — the upstream menu is not ported yet |
git-fuzzy … | second registered name for the same builtin |
Inside the status view: live diff preview, full-screen inspect, and key-bindings to stage / unstage / discard / amend / patch / commit / edit, plus a --listen-driven watcher that live-reloads on repo changes.
Environment
Set GF_STATUS_WATCH=0 to turn off that live-reload watcher.
Every key-binding is overridable; the defaults match upstream git-fuzzy:
| variable | default |
|---|---|
GIT_FUZZY_STATUS_ADD_KEY | Alt-S |
GIT_FUZZY_STATUS_ADD_PATCH_KEY | Alt-P |
GIT_FUZZY_STATUS_RESET_KEY | Alt-R |
GIT_FUZZY_STATUS_DISCARD_KEY | Alt-U |
GIT_FUZZY_STATUS_COMMIT_KEY | Alt-C |
GIT_FUZZY_STATUS_AMEND_KEY | Alt-M |
GIT_FUZZY_STATUS_EDIT_KEY | Alt-E |
GIT_FUZZY_INSPECT_KEY | Alt-I |
GIT_FUZZY_SELECT_ALL_KEY | Alt-A |
GIT_FUZZY_SELECT_NONE_KEY | Alt-D |
GIT_FUZZY_PREVIEW_WRAP_KEY | Alt-W |
GIT_FUZZY_PREVIEW_SIZE_INCREASE_KEY | Alt-= |
GIT_FUZZY_PREVIEW_SIZE_DECREASE_KEY | Alt-- |
[0x03] HOW IT WAS PORTED
The self-reentrant pattern is documented in the zshrs plugin porting guide, "self-reentrant fzf tools": docs/PORTING_ZSH_PLUGIN.md. fzf runs bind/preview commands via sh, which can't call a plugin builtin, so a generated shim runs zshrs -fc 'zmodload -R <self>; gf --helper …' — one dlopen of an mmap'd dylib per action.
[0xFF] LICENSE
MIT. Ported from bigH/git-fuzzy (MIT). See LICENSE.