A git status prompt for zsh written in Rust

Nigel Stanger authored on 13 Oct 2022
src Documentation 2 years ago
.gitignore Added initial version 2 years ago
Cargo.lock Corrected package name and version 2 years ago
Cargo.toml Corrected package name and version 2 years ago
README.md Documentation 2 years ago
README.md

zsh-rust-git-prompt

A bare-bones Git prompt for zsh implemented in Rust for speed (and as a learning exercise).

Configuration is rudimentary because I figured “how often am I going to change the appearance of my Git prompt?”

Features

  • Automatically detects Git repositories and only displays the prompt when inside one.
  • Includes the following Git status information:
    • current branch
    • commits ahead/behind remote
    • number of stashes (if any)
    • number of staged files (if any)
    • number of changed files (if any)
    • number of conflicting files (if any)
    • number of untracked files (if any)
    • number of ignored files (if any)
  • Basic format configuration via constants in the code.
  • Partial ANSI formatting support (currently only the ones I use).

Dependencies

  • Rust (compilation).
  • Your favourite Nerd Font.

Installation

  • Install Rust.
  • Install the relevant Nerd Font and set it as default in your terminal app.
  • Clone this repo.
  • cargo build --release
  • mv target/release/zsh-rust-git-prompt <bindir> where <bindir> is in PATH.
  • Add this to your .zshrc:
    RPROMPT='$(git status --porcelain=v2 --branch --show-stash -z 2>/dev/null | zsh-rust-git-prompt)'`
    (Or PROMPT if you prefer, but it’s really designed more for RPROMPT.)

Configuration

  • Changing the configuration requires a rebuild (cargo build --release) and reinstall.
  • The strings used to generate the various components of the status line can be modified by changing the constants at the top of main.rs.
  • The format of the status line can be modified by changing the format strings at the bottom of main.rs.
  • There is only partial support for ANSI formatting codes at present, provided by the *_style() functions.