Skip to content

Instantly share code, notes, and snippets.

@pwang2
Created March 2, 2021 20:04
Show Gist options
  • Save pwang2/a6b77bbc7f6e1f7016f6566fab774a77 to your computer and use it in GitHub Desktop.
Save pwang2/a6b77bbc7f6e1f7016f6566fab774a77 to your computer and use it in GitHub Desktop.
# -*- mode: sh; -*-
# Dracula Theme v1.2.5
#
# https://github.com/dracula/dracula-theme
#
# Copyright 2019, All rights reserved
#
# Code licensed under the MIT license
# http://zenorocha.mit-license.org
#
# @author Zeno Rocha <[email protected]>
# @maintainer Aidan Williams <[email protected]>
# Initialization {{{
source ${0:A:h}/lib/async.zsh
autoload -Uz add-zsh-hook
setopt PROMPT_SUBST
async_init
# }}}
# Options {{{
# Set to 1 to show the date
DRACULA_DISPLAY_TIME=${DRACULA_DISPLAY_TIME:-0}
# Set to 1 to show the 'context' segment
DRACULA_DISPLAY_CONTEXT=${DRACULA_DISPLAY_CONTEXT:-0}
# Changes the arrow icon
DRACULA_ARROW_ICON=${DRACULA_ARROW_ICON:- }
# function to detect if git has support for --no-optional-locks
dracula_test_git_optional_lock() {
local git_version=${DEBUG_OVERRIDE_V:-"$(git version | cut -d' ' -f3)"}
local git_version="$(git version | cut -d' ' -f3)"
# test for git versions < 2.14.0
case "$git_version" in
[0-1].*)
echo 0
return 1
;;
2.[0-9].*)
echo 0
return 1
;;
2.1[0-3].*)
echo 0
return 1
;;
esac
# if version > 2.14.0 return true
echo 1
}
# use --no-optional-locks flag on git
DRACULA_GIT_NOLOCK=${DRACULA_GIT_NOLOCK:-$(dracula_test_git_optional_lock)}
# }}}
# Status segment {{{
PROMPT='%(?:%F{green}:%F{red})${DRACULA_ARROW_ICON}'
# }}}
# Time segment {{{
dracula_time_segment() {
if (( DRACULA_DISPLAY_TIME )); then
if [[ -z "$TIME_FORMAT" ]]; then
TIME_FORMAT="%k:M"
# check if locale uses AM and PM
if ! locale -ck LC_TIME | grep 'am_pm=";"'; then
TIME_FORMAT="%l:%M%p"
fi
fi
print -P "%D{$TIME_FORMAT}"
fi
}
PROMPT+='%F{green}%B$(dracula_time_segment) '
# }}}
# User context segment {{{
dracula_context() {
if (( DRACULA_DISPLAY_CONTEXT )); then
if [[ -n "${SSH_CONNECTION-}${SSH_CLIENT-}${SSH_TTY-}" ]] || (( EUID == 0 )); then
echo '%n@%m '
else
echo '%n '
fi
fi
}
PROMPT+='%F{magenta}%B$(dracula_context)'
# }}}
# Directory segment {{{
PROMPT+='%F{blue}%B%c '
# }}}
# Async git segment {{{
dracula_git_status() {
cd "$1"
local ref branch lockflag
(( DRACULA_GIT_NOLOCK )) && lockflag="--no-optional-locks"
ref=$(=git $lockflag symbolic-ref --quiet HEAD 2>/tmp/git-errors)
case $? in
0) ;;
128) return ;;
*) ref=$(=git $lockflag rev-parse --short HEAD 2>/tmp/git-errors) || return ;;
esac
branch=${ref#refs/heads/}
if [[ -n $branch ]]; then
echo -n "${ZSH_THEME_GIT_PROMPT_PREFIX}${branch}"
local git_status icon
git_status="$(LC_ALL=C =git $lockflag status 2>&1)"
if [[ "$git_status" =~ 'new file:|deleted:|modified:|renamed:|Untracked files:' ]]; then
echo -n "$ZSH_THEME_GIT_PROMPT_DIRTY"
else
echo -n "$ZSH_THEME_GIT_PROMPT_CLEAN"
fi
echo -n "$ZSH_THEME_GIT_PROMPT_SUFFIX"
fi
}
dracula_git_callback() {
DRACULA_GIT_STATUS="$3"
zle && zle reset-prompt
async_stop_worker dracula_git_worker dracula_git_status "$(pwd)"
}
dracula_git_async() {
async_start_worker dracula_git_worker -n
async_register_callback dracula_git_worker dracula_git_callback
async_job dracula_git_worker dracula_git_status "$(pwd)"
}
precmd() {
dracula_git_async
}
PROMPT+='$DRACULA_GIT_STATUS'
ZSH_THEME_GIT_PROMPT_CLEAN=") %F{green}%B "
ZSH_THEME_GIT_PROMPT_DIRTY=") %F{yellow}%B "
ZSH_THEME_GIT_PROMPT_PREFIX="%F{cyan}%B("
ZSH_THEME_GIT_PROMPT_SUFFIX="%f%b"
# }}}
# Ensure effects are reset
PROMPT+='%f%b'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment