# lean prompt theme # by Miek Gieben: https://github.com/miekg/lean # # Base on Pure by Sindre Sorhus: https://github.com/sindresorhus/pure # # MIT License PROMPT_LEAN_TMUX=${PROMPT_LEAN_TMUX-"t "} PROMPT_LEAN_PATH_PERCENT=${PROMPT_LEAN_PATH_PERCENT-60} prompt_lean_help() { cat <<'EOF' This is a one line prompt that tries to stay out of your face. It utilizes the right side prompt for most information, like the CWD. The left side of the prompt is only a '%'. The only other information shown on the left are the jobs numbers of background jobs. When the exit code of a process isn't zero the prompt turns red. If a process takes more then 5 (default) seconds to run the total running time is shown in the next prompt. Configuration: PROMPT_LEAN_TMUX: used to indicate being in tmux, set to "t ", by default PROMPT_LEAN_LEFT: executed to allow custom information in the left side PROMPT_LEAN_RIGHT: executed to allow custom information in the right side PROMPT_LEAN_VIMODE: used to determine wither or not to display indicator PROMPT_LEAN_VIMODE_FORMAT: Defaults to "%F{red}[NORMAL]%f" You can invoke it thus: prompt lean EOF } # turns seconds into human readable time, 165392 => 1d 21h 56m 32s prompt_lean_human_time() { local tmp=$1 local days=$(( tmp / 60 / 60 / 24 )) local hours=$(( tmp / 60 / 60 % 24 )) local minutes=$(( tmp / 60 % 60 )) local seconds=$(( tmp % 60 )) (( $days > 0 )) && echo -n "${days}d " (( $hours > 0 )) && echo -n "${hours}h " (( $minutes > 0 )) && echo -n "${minutes}m " echo "${seconds}s " } # fastest possible way to check if repo is dirty prompt_lean_git_dirty() { # check if we're in a git repo command git rev-parse --is-inside-work-tree &>/dev/null || return # check if it's dirty local umode="-uno" #|| local umode="-unormal" command test -n "$(git status --porcelain --ignore-submodules ${umode} 2>/dev/null | head -100)" (($? == 0)) && echo ' +' } # displays the exec time of the last command if set threshold was exceeded prompt_lean_cmd_exec_time() { local stop=$EPOCHSECONDS local start=${cmd_timestamp:-$stop} integer elapsed=$stop-$start (($elapsed > ${PROMPT_LEAN_CMD_MAX_EXEC_TIME:=5})) && prompt_lean_human_time $elapsed } prompt_lean_preexec() { cmd_timestamp=$EPOCHSECONDS # shows the current dir and executed command in the title when a process is active print -Pn "\e]0;" echo -nE "$PWD:t: $2" print -Pn "\a" } prompt_lean_pwd() { local lean_path="`print -Pn '%~'`" if (($#lean_path / $COLUMNS.0 * 100 > ${PROMPT_LEAN_PATH_PERCENT:=60})); then print -Pn '...%2/' return fi print "$lean_path" } prompt_lean_precmd() { vcs_info rehash local jobs local prompt_lean_jobs unset jobs for a (${(k)jobstates}) { j=$jobstates[$a];i="${${(@s,:,)j}[2]}" jobs+=($a${i//[^+-]/}) } # print with [ ] and comma separated prompt_lean_jobs="" [[ -n $jobs ]] && prompt_lean_jobs="%F{242}["${(j:,:)jobs}"] " local lean_vimode_default="%F{red}[NORMAL]%f" #If LEAN_VIMODE is set, set lean_vimode_indicator to either PROMPT_LEAN_VIMOD_FORMAT or a default value local lean_vimode_indicator="${PROMPT_LEAN_VIMODE:+${PROMPT_LEAN_VIMODE_FORMAT:-${lean_vimode_default}}}" prompt_lean_vimode="${${KEYMAP/vicmd/$lean_vimode_indicator}/(main|viins)/}" PROMPT="$prompt_lean_jobs%F{yellow}${prompt_lean_tmux}%f`$PROMPT_LEAN_LEFT`%f%(?.%F{blue}.%B%F{red})%#%f%b " RPROMPT="%F{yellow}`prompt_lean_cmd_exec_time`%f$prompt_lean_vimode%F{blue}`prompt_lean_pwd`%F{242}$vcs_info_msg_0_`prompt_lean_git_dirty`$prompt_lean_host%f`$PROMPT_LEAN_RIGHT`%f" unset cmd_timestamp # reset value since `preexec` isn't always triggered } function zle-keymap-select { prompt_lean_precmd zle reset-prompt } prompt_lean_setup() { prompt_opts=(cr subst percent) zmodload zsh/datetime autoload -Uz add-zsh-hook autoload -Uz vcs_info [[ "$PROMPT_LEAN_VIMODE" != '' ]] && zle -N zle-keymap-select add-zsh-hook precmd prompt_lean_precmd add-zsh-hook preexec prompt_lean_preexec zstyle ':vcs_info:*' enable git zstyle ':vcs_info:git*' formats ' %b' zstyle ':vcs_info:git*' actionformats ' %b|%a' [[ "$SSH_CONNECTION" != '' ]] && prompt_lean_host=" %F{yellow}%m%f" [[ "$TMUX" != '' ]] && prompt_lean_tmux=$PROMPT_LEAN_TMUX return 0 } prompt_lean_setup "$@"