summaryrefslogtreecommitdiff
path: root/.zsh-powerline.sh
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2021-02-14 18:59:26 +0100
committerMarc Vertes <mvertes@free.fr>2021-02-14 18:59:26 +0100
commitfdbb4f3bd7a651834904d0446303b10a76a6e349 (patch)
treef5f79f29f740a43328c06e370d0cf7549b687e91 /.zsh-powerline.sh
parent9aa203f7d7a1899aac7bb7d8209cc2a394ffdbd8 (diff)
update
Diffstat (limited to '.zsh-powerline.sh')
-rw-r--r--.zsh-powerline.sh80
1 files changed, 80 insertions, 0 deletions
diff --git a/.zsh-powerline.sh b/.zsh-powerline.sh
new file mode 100644
index 0000000..f0835a4
--- /dev/null
+++ b/.zsh-powerline.sh
@@ -0,0 +1,80 @@
+# Colorscheme
+readonly COLOR_CWD='blue'
+readonly COLOR_GIT='cyan'
+readonly COLOR_SUCCESS='green'
+readonly COLOR_FAILURE='red'
+readonly COLOR_TIME='cyan'
+
+readonly SYMBOL_GIT_BRANCH='⑂'
+readonly SYMBOL_GIT_MODIFIED='*'
+readonly SYMBOL_GIT_PUSH='↑'
+readonly SYMBOL_GIT_PULL='↓'
+readonly PS_SYMBOL='$'
+
+_git_info() {
+ hash git 2>/dev/null || return # git not found
+
+ # get current branch
+ local ref=$(git symbolic-ref --short HEAD 2>/dev/null)
+
+ if [[ -n "$ref" ]]; then
+ # prepend branch symbol
+ ref=$SYMBOL_GIT_BRANCH$ref
+ else
+ # get most recent tag or abbreviated unique hash
+ ref=$(git describe --tags --always 2>/dev/null)
+ fi
+
+ [[ -n "$ref" ]] || return # not a git repo
+
+ local marks
+
+ # scan first two lines of output from `git status`
+ while IFS= read -r line; do
+ if [[ $line =~ ^## ]]; then # header line
+ [[ $line =~ ahead\ ([0-9]+) ]] && marks+=" $SYMBOL_GIT_PUSH$match[1]"
+ [[ $line =~ behind\ ([0-9]+) ]] && marks+=" $SYMBOL_GIT_PULL$match[1]"
+ else # branch is modified if output contains more lines after the header line
+ marks="$SYMBOL_GIT_MODIFIED$marks"
+ break
+ fi
+ done < <(git status --porcelain --branch 2>/dev/null) # note the space between the two <
+
+ # print without a trailing newline
+ printf " $ref$marks"
+}
+
+
+_config_prompt() {
+ # Color coding based on exit code of the previous command. Note this must
+ # be dealt with in the beginning of the function, otherwise the $? will not
+ # match the right command executed.
+
+ if [[ $? -eq 0 ]]; then
+ local symbol="%F{$COLOR_SUCCESS}$PS_SYMBOL%f"
+ else
+ local symbol="%F{$COLOR_FAILURE}$PS_SYMBOL%f"
+ fi
+
+ local cwd="%F{$COLOR_CWD}%~%f"
+ local git="%F{$COLOR_GIT}$(_git_info)%f"
+ local time="%F{$COLOR_TIME}%D{%H:%M:%S}%f"
+
+ PROMPT="$cwd$git $symbol "
+ RPROMPT="$time"
+}
+
+
+# useful zsh hook functions
+
+precmd() { # run before each prompt
+ _config_prompt
+}
+
+
+preexec() { # run after user command is read and about to execute
+}
+
+
+chpwd() { # run when changing current working directory
+}