diff --git a/modules/prompt/functions/prompt_minimal_setup b/modules/prompt/functions/prompt_minimal_setup new file mode 120000 index 0000000..7e226df --- /dev/null +++ b/modules/prompt/functions/prompt_minimal_setup @@ -0,0 +1 @@ +../themes/minimal.zsh-theme \ No newline at end of file diff --git a/modules/prompt/themes/minimal.zsh-theme b/modules/prompt/themes/minimal.zsh-theme new file mode 100644 index 0000000..cb07f71 --- /dev/null +++ b/modules/prompt/themes/minimal.zsh-theme @@ -0,0 +1,103 @@ +# +# Minimal theme +# https://github.com/S1cK94/minimal +# + +autoload -U colors && colors + +setopt prompt_subst + +PROMPT_CHAR="❯" + +ON_COLOR="%{$fg[green]%}" +OFF_COLOR="%{$reset_color%}" +ERR_COLOR="%{$fg[red]%}" + +function prompt_user() { + echo "%(!.$ON_COLOR.$OFF_COLOR)$PROMPT_CHAR%{$reset_color%}" +} + +function prompt_jobs() { + echo "%(1j.$ON_COLOR.$OFF_COLOR)$PROMPT_CHAR%{$reset_color%}" +} + +function prompt_status() { + echo "%(0?.$ON_COLOR.$ERR_COLOR)$PROMPT_CHAR%{$reset_color%}" +} + +function -prompt_ellipse(){ + local string=$1 + local sep="$rsc..$path_color" + if [[ $MINIMAL_SHORTEN == true ]] && [[ ${#string} -gt 10 ]]; then + echo "${string:0:4}$sep${string: -4}" + else + echo $string + fi +} + +function prompt_path() { + local path_color="%{%}%}" + local rsc="%{$reset_color%}" + local sep="$rsc/$path_color" + + echo "$path_color$(print -P %2~ | sed s_/_${sep}_g)$rsc" +} + +function git_branch_name() { + local branch_name="$(git rev-parse --abbrev-ref HEAD 2> /dev/null)" + [[ -n $branch_name ]] && echo "$branch_name" +} + +function git_repo_status(){ + local rs="$(git status --porcelain -b)" + + if $(echo "$rs" | grep -v '^##' &> /dev/null); then # is dirty + echo "%{$fg[red]%}" + elif $(echo "$rs" | grep '^## .*diverged' &> /dev/null); then # has diverged + echo "%{$fg[red]%}" + elif $(echo "$rs" | grep '^## .*behind' &> /dev/null); then # is behind + echo "%{%}%}" + elif $(echo "$rs" | grep '^## .*ahead' &> /dev/null); then # is ahead + echo "%{$reset_color%}" + else # is clean + echo "%{$fg[green]%}" + fi +} + +function prompt_git() { + local bname=$(git_branch_name) + if [[ -n $bname ]]; then + local infos="$(git_repo_status)$bname%{$reset_color%}" + echo " $infos" + fi +} + +function prompt_vimode(){ + local ret="" + + case $KEYMAP in + main|viins) + ret+="$ON_COLOR" + ;; + vicmd) + ret+="$OFF_COLOR" + ;; + esac + + ret+="$PROMPT_CHAR%{$reset_color%}" + + echo "$ret" +} + +function zle-line-init zle-line-finish zle-keymap-select { + zle reset-prompt + zle -R +} + +zle -N zle-line-init +zle -N zle-keymap-select +zle -N zle-line-finish + +PROMPT='$(prompt_user)$(prompt_jobs)$(prompt_vimode)$(prompt_status) ' +RPROMPT='$(prompt_path)$(prompt_git)' +