# -*- 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 # @maintainer Aidan Williams # 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 {{{ # arrow is green if last command was successful, red if not, # turns yellow in vi command mode PROMPT='%(1V:%F{yellow}:%(?:%F{green}:%F{red}))${DRACULA_ARROW_ICON}' # }}} # Time segment {{{ dracula_time_segment() { if (( DRACULA_DISPLAY_TIME )); then if [[ -z "$TIME_FORMAT" ]]; then TIME_FORMAT=" %-H:%M" # check if locale uses AM and PM if ! locale -ck LC_TIME | grep 'am_pm=";"' > /dev/null; then TIME_FORMAT=" %-I:%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)" } add-zsh-hook 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 vi mode is handled by prompt function zle-keymap-select zle-line-init { if [[ $KEYMAP = vicmd ]]; then psvar[1]=vicmd else psvar[1]='' fi zle reset-prompt zle -R } zle -N zle-line-init zle -N zle-keymap-select # Ensure effects are reset PROMPT+='%f%b'