#!/usr/bin/env zsh ## Author: druckdev ## Created: 2020-08-28 ## ## A TUI for git-log using fzf. ## Displays git-log in fzf and git-show as preview command for each commit. # extendedglob is necessary for the expansion of the binds array emulate -L zsh -o extendedglob # Return if fzf is not available if (( ! $+commands[fzf] )); then printf "command not found: fzf" >&2 return 1 fi # Return if not in git repo git rev-parse || return # One line format for fzf list view # abbreviated commit hash (yellow), title and ref names local formatshort='--pretty=format:%C(yellow)%h %Creset%s%C(auto)%d' # Verbose format for the preview window on the right # This array is stitched together with newlines later local -a format=( '--pretty=format:%C(yellow)' # newline created by this eaten by %- '%-Commit: %H%C(auto)' # yellow commit hash ' %D%Cblue' # auto colored ref names (if any) 'Author: %aN %aE%Cred' # blue author mail 'AuthorDate: %ad%Cblue' # red author date 'Commit: %cN %cE%Cred' # blue commiter mail 'CommitDate: %cd%Cblue' # red commit date 'Signer: %GS%Cgreen' # signer name 'Key (%G?): %GK' # pgp key used to sign '%Creset%C(bold)' # empty line ' %s%Creset' # bold white subject '' # newline '%-b' # body '' # newline ) # Ignore the graph part at the beginning, then capture the commit hash and throw # away the rest of the line. local commit_hash='s/^[^a-f0-9]*([a-f0-9]*).*$/\1/' local dateshort='--date=format:%F' # year local date="$dateshort %T %z" # year time timezone local -A fzf_preview read -r -d '' </dev/null)}) if (( ! $? )) && (( $tty_size[2] > 152 )); then fzf_args+=(--preview-window=right) else fzf_args+=(--preview-window=down) fi # Display the commits in the above format and pipe that into fzf. git log "$formatshort" "$dateshort" --color=always "$@" \ | env LESS="$LESS${LESS:+ }-+F" fzf "${fzf_args[@]}" return 0