From d8d0325842ad711b4211160325b006792d8c5670 Mon Sep 17 00:00:00 2001 From: Nikolas Weger Date: Mon, 21 Aug 2017 17:13:50 +0200 Subject: [PATCH] added a few themes --- cfg/zsh/cfg.d/export | 3 + cfg/zsh/cfg.zsh | 3 +- lib/local/prompt_nerdish_setup | 90 ++++++++++++++++++++++ lib/local/prompt_z4rr3t_setup | 135 +++++++++++++++++++++++++++++++++ 4 files changed, 229 insertions(+), 2 deletions(-) create mode 100644 lib/local/prompt_nerdish_setup create mode 100644 lib/local/prompt_z4rr3t_setup diff --git a/cfg/zsh/cfg.d/export b/cfg/zsh/cfg.d/export index dc271b7..cc720aa 100644 --- a/cfg/zsh/cfg.d/export +++ b/cfg/zsh/cfg.d/export @@ -19,3 +19,6 @@ export EDITOR='vim' # Completions Paths fpath+=(${DOTLIB}/completions/src) fpath+=(${DOTLIB}/local) + +# Reload all Prompts +autoload -U promptinit && promptinit diff --git a/cfg/zsh/cfg.zsh b/cfg/zsh/cfg.zsh index 99f590a..c388fcc 100644 --- a/cfg/zsh/cfg.zsh +++ b/cfg/zsh/cfg.zsh @@ -3,5 +3,4 @@ source ${HOME}/dotfiles/cfg/zsh/cfg.d/export for file in ${DOTCFGD}/*.zsh; do source $file; done # Prompt -autoload -U promptinit && promptinit -prompt filthy +prompt z4rr3t diff --git a/lib/local/prompt_nerdish_setup b/lib/local/prompt_nerdish_setup new file mode 100644 index 0000000..baed8d8 --- /dev/null +++ b/lib/local/prompt_nerdish_setup @@ -0,0 +1,90 @@ +#!/usr/bin/env zsh + ++vi-prompt-nerdish-git-hook-enable() { + if [ "$(command git rev-parse --is-inside-work-tree 2> /dev/null)" != "true" ]; then + return 1 + fi + + return 0 +} + ++vi-prompt-nerdish-git-hook-remote-status() { + if [ "$1" != "1" ]; then + return 0 + fi + + command git rev-parse --abbrev-ref @'{u}' &>/dev/null || return 0 + + local arrow_status="" + arrow_status="$(command git rev-list --left-right --count HEAD ...@'{u}' 2>/dev/null)" + (( !$? )) || return 0 + + arrow_status=(${(ps:\t:)status}) + + local arrows left="${arrow_status[0]}" right="${arrow_status[1]}" + + (( ${right:-0} > 0 )) && arrows+="%F{cyan}$(echo -e "${NERDISH_SYMBOL_GIT_STATUS_ARROW_DOWN:-"\uf13a"}")%f" + (( ${left:-0} > 0 )) && arrows+="%F{magenta}$(echo -e "${NERDISH_SYMBOL_GIT_STATUS_ARROW_UP:-"\uf139"}")%f" + + if [ -n "${arrows:-}" ]; then + hook_com[misc]+="${arrows}" + fi +} + +prompt_nerdish_precmd() { + vcs_info +} + +prompt_nerdish_setup() { + local _prompt="$(echo -e "${NERDISH_SYMBOL_PROMPT:-"\uf105"}")" + local _directory="$(echo -e "${NERDISH_SYMBOL_DIRECTORY:-"\uf0a0"}")" + local _branch="$(echo -e "${NERDISH_SYMBOL_GIT_BRANCH:-"\ue725"}")" + local _action="$(echo -e "${NERDISH_SYMBOL_GIT_ACTION:-"\uf101"}")" + local _staged="$(echo -e "${NERFISH_SYMBOL_GIT_STAGED:-"\uf055"}")" + local _unstaged="$(echo -e "${NERDISH_SYMBOL_GIT_UNSTAGED:-"\uf059"}")" + + local _machine="" + if [ "$(uname -s)" = "Darwin" ]; then + _machine="%F{white}$(echo -e "\uf179")%f" + elif [[ "$(uname -s)" =~ "^MSYS2_NT" ]]; then + _machine="%F{blue}$(echo -e "\u17a")%f" + elif [ "$(uname -s)" = "Linux" ]; then + : # TODO + fi + + setopt prompt_subst + + autoload -Uz add-zsh-hook + autoload -Uz vcs_info + + add-zsh-hook precmd prompt_nerdish_precmd + + zstyle ':vcs_info:*' enable git + zstyle ':vcs_info:*' use-simple true + zstyle ':vcs_info:*' max-exports 3 + zstyle ':vcs_info:git:*' check-for-changes true + zstyle ':vcs_info:git:*' stagedstr "%F{green}${_staged}%f" + zstyle ':vcs_info:git:*' unstagedstr "%F{yellow}${_unstaged}%f" + + zstyle ':vcs_info:git+set-message:*' hooks \ + prompt-nerdish-git-hook-enable \ + prompt-nerdish-git-hook-remote-status + + + zstyle ':vcs_info:git*' formats \ + "${_branch}%b" \ + "%c%u %m" + zstyle ':vcs_info:git*' actionformats \ + "${_branche}%b${_action}%a" \ + "%c%u %m" + + local preline="%F{green}${_directory}%f %F{blue}%~%f" + local cmdline="%(?.%F{magenta}.%F{red})${_prompt}%f" + + PROMPT=" +${preline} \${vcs_info_msg_0_} \${vcs_info_msg_1_} +${_machine} ${cmdline}" +} + +prompt_nerdish_setup "${@:-}" + diff --git a/lib/local/prompt_z4rr3t_setup b/lib/local/prompt_z4rr3t_setup new file mode 100644 index 0000000..5296f43 --- /dev/null +++ b/lib/local/prompt_z4rr3t_setup @@ -0,0 +1,135 @@ +# z4rr3t +# by Garret Jennings +# https://github.com/inimicus/z4rr3t +# Based on Pure +# by Sindre Sorhus +# https://github.com/sindresorhus/pure +# MIT License + +# For my own and others sanity +# git: +# %b => current branch +# %a => current action (rebase/merge) +# prompt: +# %F => color dict +# %f => reset color +# %~ => current path +# %* => time +# %n => username +# %m => shortname host +# %(?..) => prompt conditional - %(condition.true.false) + + +# turns seconds into human readable time +# 165392 => 1d 21h 56m 32s +prompt_z4rr3t_human_time() { + echo -n " " + 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_z4rr3t_git_dirty() { + # check if we're in a git repo + [[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]] || return + # check if it's dirty + [[ "$Z4RR3T_GIT_UNTRACKED_DIRTY" == 0 ]] && local umode="-uno" || local umode="-unormal" + command test -n "$(git status --porcelain --ignore-submodules ${umode})" + + (($? == 0)) && echo '*' +} + +# displays the exec time of the last command if set threshold was exceeded +prompt_z4rr3t_cmd_exec_time() { + local stop=$EPOCHSECONDS + local start=${cmd_timestamp:-$stop} + integer elapsed=$stop-$start + (($elapsed > ${Z4RR3T_CMD_MAX_EXEC_TIME:=10})) && prompt_z4rr3t_human_time $elapsed +} + +prompt_z4rr3t_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" +} + +# string length ignoring ansi escapes +prompt_z4rr3t_string_length() { + echo $(( ${#${(S%%)1//(\%([KF1]|)\{*\}|\%[Bbkf])}} )) +} + +prompt_z4rr3t_precmd() { + # shows the full path in the title + print -Pn '\e]0;%~\a' + + # git info + vcs_info + + local prompt_z4rr3t_preprompt="$prompt_z4rr3t_username%F{blue}%~%F{242}$vcs_info_msg_0_`prompt_z4rr3t_git_dirty`%f%F{yellow}`prompt_z4rr3t_cmd_exec_time`%f" + print -P $prompt_z4rr3t_preprompt + + # check async if there is anything to pull + (( ${Z4RR3T_GIT_PULL:-1} )) && { + # check if we're in a git repo + [[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]] && + # make sure working tree is not $HOME + [[ "$(command git rev-parse --show-toplevel)" != "$HOME" ]] && + # check check if there is anything to pull + command git fetch &>/dev/null && + # check if there is an upstream configured for this branch + command git rev-parse --abbrev-ref @'{u}' &>/dev/null && { + local arrows='' + (( $(command git rev-list --right-only --count HEAD...@'{u}' 2>/dev/null) > 0 )) && arrows='⇣' + (( $(command git rev-list --left-only --count HEAD...@'{u}' 2>/dev/null) > 0 )) && arrows+='⇡' + print -Pn "\e7\e[A\e[1G\e[`prompt_z4rr3t_string_length $prompt_z4rr3t_preprompt`C%F{cyan}${arrows}%f\e8" + } + } &! + + # reset value since `preexec` isn't always triggered + unset cmd_timestamp +} + + +prompt_z4rr3t_setup() { + # prevent percentage showing up + # if output doesn't end with a newline + export PROMPT_EOL_MARK='' + + # disable auth prompting on git 2.3+ + export GIT_TERMINAL_PROMPT=0 + + prompt_opts=(cr subst percent) + + zmodload zsh/datetime + autoload -Uz add-zsh-hook + autoload -Uz vcs_info + + add-zsh-hook precmd prompt_z4rr3t_precmd + add-zsh-hook preexec prompt_z4rr3t_preexec + + zstyle ':vcs_info:*' enable git + zstyle ':vcs_info:git*' formats ' %b' + zstyle ':vcs_info:git*' actionformats ' %b|%a' + + # show username@host if logged in through SSH + [[ "$SSH_CONNECTION" != '' ]] && prompt_z4rr3t_username='%F{yellow}%n%F{white}@%F{242}%m ' + + # show username@host if root, with username in white + [[ $UID -eq 0 ]] && prompt_z4rr3t_username='%F{white}%n%F{red}@%F{242}%m ' + + # prompt turns red if the previous command didn't exit with 0 + PROMPT="%(?.%F{magenta}.%F{red})${Z4RR3T_PROMPT_SYMBOL:-❯}%f " +} + +prompt_z4rr3t_setup "$@" +