Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/glfmn/glitter
Display git status information in your shell prompt
https://github.com/glfmn/glitter
bash cli fish-shell git powershell pretty-printer rust utility zsh
Last synced: 3 months ago
JSON representation
Display git status information in your shell prompt
- Host: GitHub
- URL: https://github.com/glfmn/glitter
- Owner: glfmn
- License: mpl-2.0
- Created: 2017-12-23T05:58:03.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2022-10-06T18:59:36.000Z (over 2 years ago)
- Last Synced: 2024-09-18T00:41:47.491Z (4 months ago)
- Topics: bash, cli, fish-shell, git, powershell, pretty-printer, rust, utility, zsh
- Language: Rust
- Homepage:
- Size: 7.74 MB
- Stars: 51
- Watchers: 3
- Forks: 2
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ✨ glitter
![Glit is an informative shell prompt](img/glit-demo.gif)
**Git status summary with custom formats, perfect for your shell prompt**
[![Crates.io](https://img.shields.io/crates/v/glit.svg)](https://crates.io/crates/glit)[![Build Status](https://travis-ci.org/glfmn/glitter.svg?branch=master)](https://travis-ci.org/glfmn/glitter)
Glitter is a cross-platform command-line tool and format language for making informative git prompts. Glitter's interpreter, `glit` will:
- Read status information from your git repository through the git api
- Parse and Interpret the provided format
- Output your format with the requested information to `stdout`Glitter is a binary tool which affords blazing speed, offers maximum flexibility, and painless installation. This makes Glitter an ideal alternative to alternative to tools like [`bash-git-prompt`](https://github.com/magicmonty/bash-git-prompt), [`zsh-git-prompt`](https://github.com/olivierverdier/zsh-git-prompt), and [`posh-git`](https://github.com/dahlbyk/posh-git).
Glitter has been tested on Windows, Mac, and Ubuntu; it works in Powershell, zsh, bash, and theoretically any shell environment that supports a prompt command.
# Installation
Go to the [release](https://github.com/glfmn/glitter/releases) page and download a binary for your platform.
To make sure Glitter is installed:
```
$ glit "'hello from git'" -e "'hello'"
```It will output `hello from git` if the current directory is in a git repository and `hello` if it is not.
### Build from source
Install the [rust toolchain](https://rustup.rs), `cmake` and `openssl` first, and then:
```
$ cargo install glit
```## Setting up your shell
Once Glitter is installed, you need to set it to update your prompt.
### Bash
Add the following snippet to your `~/.bashrc` or just paste the snippet in your shell to try it without doing anything permanent.
```bash
# Format to use inside of git repositories or their sub-folders
export GIT_FMT="#g*(b)..#r(B)[+('↑')-('↓'), #~(#g(MARD):#r(maud)), h(#m('@'))]:#b*('\w')'\n\$ '"# Format to use outside of git repositories
export PS1_FMT="#g(#*('\u')@'\h'):#b*('\w')'\$ '"__set_prompt() {
PS1="$(glit "$GIT_FMT" -b -e "$PS1_FMT")"
}export PROMPT_COMMAND=__set_prompt
```### Powershell
Add the following snippet to your `$PROFILE` or just paste the snippet in your shell to try it without doing anything permanent.
```powershell
# Format to use inside of git repositories
$GIT_FMT=":#y([#c*(b) #c(B):#~(+,-) | #~(#g(MARD):#r(maud):#m(h('@')))])"function prompt {
$path = $(get-location)
glit "'$path'$GIT_FMT'> '" -e "'$path> '"
}
```### zsh
Add the following snippet to your `~/.zshrc` file or just paste the snippet in your shell to try it without doing anything permanent.
```zsh
# Format used in a git repository
export GIT_FMT="#g*(b)..#r(B)[+('↑')-('↓'), #~(#g(MARD):#r(maud)), h(#m('@'))] #b*('%~')"# Fallback format used outside of git repositories
export PS1_FMT="#g*('%m')#b*('%~')"precmd() { print -rP "$(glit "$GIT_FMT" -b -e "$PS1_FMT")" }
PROMPT="%# "
```### fish
Replace your `~/.config/fish/functions/fish_prompt.fish` file with or just paste the snippet in your shell to try it without doing anything permanent.
```fish
function fish_prompt
set -l path (prompt_pwd)
# format used in git repositories
set git "#g*(b)..#r(B)[+('↑')-('↓'), #~(#g(MARD):#r(maud)), h(#m('@'))] #y('$path')'\n> '"
# fallback format used outside of git repositories
set ps1 "#y('$path ')'> '"echo -e (glit $git -e $ps1)
end
```# Customizing your format
Glitter provides a flexible expression language which is easy to use and easy to prototype with.
![`glit` is easy to experiment with.](img/glit-command.gif)
| Colorless Example |
| :------------------------------- |
| ![example-3](img/example-3.png) |
| `"b..B({+-}) [MARD] \(maud) h"` || Compact Example |
|:---------------------------------------------------------|
| ![example-1](img/example-1.png) |
| `"[#c*(b)@#c(B):{+,-} \| #~(#g(MARD):#r(maud):h('@'))]"` || Friendly for git Beginners |
|:------------------------------------------------------------------------------------------------|
| ![example-2](img/example-2.png) |
| `"#g*(b)..#r(B)[#g(+(#~('ahead '))), #r(-(#~('behind '))), #~(#g(MARD)#r(maud)), h('stash ')]"` |
| Closely matches the information in `git status -sb` |A glitter format is made of 4 types of expressions:
- Informational expressions
- Group expressions
- Strings
- Separators
- Format expressions### Git Information
| Formatter | Meaning | Example |
|:----------|:-------------------------------|:----------------|
| `b` | branch name or head commit id | `master` |
| `B` | tracking branch with remote | `origin/master` |
| `+` | # of commits ahead remote | `+1` |
| `-` | # of commits behind remote | `-1` |
| `m` | # of unstaged modified files | `M1` |
| `a` | # of untracked files | `?1` |
| `d` | # of unstaged deleted files | `D1` |
| `u` | # of merge conflicts | `U1` |
| `M` | # of staged modified files | `M1` |
| `A` | # of added files | `A1` |
| `R` | # of renamed files | `R1` |
| `D` | # of staged deleted files | `D1` |
| `h` | # of stashed changes | `H1` |You can provide other expressions as arguments to expressions which replace the default prefix which appears before the result or file count. For example, `\h('@')` will output `@3`
instead of `H3` if your repository has 3 stashes. You can provide an arbitrary number of valid expressions as arguments to any of these expressions.```
$ glit "b"
master
$ glit "b('on branch ')"
on branch master
```Expressions generally only render any output if their corresponding values aren't empty; in other words, if there are no added files, `glit` will not produce `A0` as the output of `\A`, but instead will output an empty string.
### Grouping
Glitter will surround grouped expressions with parentheses or brackets, and will print nothing if the group is empty.
| Macro | Result |
|:----------|:--------------------------------|
| `[]` | empty |
| `\(a)` | `(?1)`; note the preceeding `\` |
| `<>` | empty |
| `{}` | empty |
| `{b}` | `{master}` |
| `<+->` | `<+1-1>` |
| `[MAR]` | `[M1A3]` where `R` is 0 |
| `[r\(a)]` | empty, when `r`, `a` are 0 |```
$ glit "b"
```### Strings
Any characters between single quotes are strings. Strings appear untouched in the output; for example, `'exact'` outputs `exact`.
```
$ glit "'hello world'"
hello world
$ glit "'\n\w\n\u'"
\n\w\n\u
$ glit "'separate' 'words'"
separate words
```### Separators
Separators appear between expressions to help differentiate or group them. Supported separators are:
| Separator | Symbol |
|------------|--------|
| Space | ` ` |
| Bar/Pipe | `\|` |
| At | `@` |
| Underscore | `_` |
| Colon | `:` |
| Semicolon | `;` |
| Comma | `,` |
| Dot | `.` |Any number of separators can be used between two expressions
```
$ glit "'hello', 'world'"
hello, world
$ glit "b@B::'git'"
master::git # there is no tracking branch (B)
master@origin/master::git # there is a tracking branch (B)
$ glit "b[+] | B"
master[+1] | origin/master # ahead 1 commit of tracking branch
master | origin/master # no difference between master and tracking
```Separators will always print if _any_ expression in the group has printed before it, and if the expression _immediately_ after prints anything.
```
glit "b [..B..]" # [..B..] is a separate group
master [origin/master] # nothing prints before or after B
```This can lead to unexpected behavior like the following:
```
$ glit "b MA"
master M1A1 # 1 staged change, 1 new file
masterA1 # no staged changes, 1 new file
```The solution is to group the expressions that follow somehow:
```
$ glit "b [MA]"
master [A1]
$ glit "b #~(MA)" # tip: use reset style
master A1 # notice no extra output
```### Formatting text
Glitter expressions support ANSI terminal formatting through the following styles:
| Format | Meaning |
| :-------------------- | :---------------------------- |
| `#~('...')` | reset |
| `#_('...')` | underline |
| `#i('...')` | italic text |
| `#*('...')` | bold text |
| `#r('...')` | red text |
| `#g('...')` | green text |
| `#b('...')` | blue text |
| `#m('...')` | magenta/purple text |
| `#y('...')` | yellow text |
| `#w('...')` | white text |
| `#k('...')` | bright black text |
| `#[01,02,03]('...')` | 24 bit RGB text color |
| `#R('...')` | red background |
| `#G('...')` | green background |
| `#B('...')` | blue background |
| `#M('...')` | magenta/purple background |
| `#Y('...')` | yellow background |
| `#W('...')` | white background |
| `#K('...')` | bright black background |
| `#{01,02,03}('...')` | 24 bit RGB background color |Format styles can be combined in a single expression by just combining them:
| Format | Meaning |
|:-------------------|:-------------------------------|
| `#wK('...')` | white text, black background |
| `#r*('...')` | red bold text |
| `#g_('...')` | green underline text |
| `#~_*('...')` | underline bold text with the reset color |```
$ glit "#r*('hello world')"
$ glit "#g*(b)"
$ glit "#[255,175,52]('orange text')"
$ glit "#G('green background')"
````glit` can understand and respects complicated nested styles, providing maximum flexibility.
```
$ glit "#g('green text with some '#*('bold')' green text')"
$ glit "#g*(b(#~('on branch ')))"
```