diff options
Diffstat (limited to 'functions/fish_prompt.fish')
-rw-r--r-- | functions/fish_prompt.fish | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/functions/fish_prompt.fish b/functions/fish_prompt.fish new file mode 100644 index 0000000..180359d --- /dev/null +++ b/functions/fish_prompt.fish @@ -0,0 +1,333 @@ + +# Set these options in your config.fish (if you want to :]) +# +# set -g theme_display_user yes +# set -g theme_hostname never +# set -g theme_hostname always +# set -g default_user your_normal_user + + + +# Backward compatibility +# +# Note: Do not depend on these behavior. These can be removed in anytime by the +# author in the name of code readability. +if set -q theme_hide_hostname + # Existing $theme_hostname will always override $theme_hide_hostname + if not set -q theme_hostname + if [ "theme_hide_hostname" = "yes" ] + set -g theme_hostname never + end + if [ "theme_hide_hostname" = "no" ] + set -g theme_hostname always + end + end +end + + +# +# Segments functions +# +set -g current_bg NONE +set -g segment_separator \uE0B0 + +function prompt_segment -d "Function to draw a segment" + set -l bg + set -l fg + if [ -n "$argv[1]" ] + set bg $argv[1] + else + set bg normal + end + if [ -n "$argv[2]" ] + set fg $argv[2] + else + set fg normal + end + if [ "$current_bg" != 'NONE' -a "$argv[1]" != "$current_bg" ] + set_color -b $bg + set_color $current_bg + echo -n "$segment_separator " + set_color -b $bg + set_color $fg + else + set_color -b $bg + set_color $fg + echo -n " " + end + set current_bg $argv[1] + if [ -n "$argv[3]" ] + echo -n -s $argv[3] " " + end +end + +function prompt_finish -d "Close open segments" + if [ -n $current_bg ] + set_color -b normal + set_color $current_bg + echo -n "$segment_separator " + end + set -g current_bg NONE +end + + +# +# Components +# +function prompt_virtual_env -d "Display Python virtual environment" + if test "$VIRTUAL_ENV" + prompt_segment white black (basename $VIRTUAL_ENV) + end +end + + +function prompt_user -d "Display current user if different from $default_user" + set -l BG 444444 + set -l FG BCBCBC + + if [ "$theme_display_user" = "yes" ] + if [ "$USER" != "$default_user" -o -n "$SSH_CLIENT" ] + set USER (whoami) + get_hostname + if [ $HOSTNAME_PROMPT ] + set USER_PROMPT $USER@$HOSTNAME_PROMPT + else + set USER_PROMPT $USER + end + prompt_segment $BG $FG $USER_PROMPT + end + else + get_hostname + if [ $HOSTNAME_PROMPT ] + prompt_segment $BG $FG $HOSTNAME_PROMPT + end + end +end + +function get_hostname -d "Set current hostname to prompt variable $HOSTNAME_PROMPT if connected via SSH" + set -g HOSTNAME_PROMPT "" + if [ "$theme_hostname" = "always" -o \( "$theme_hostname" != "never" -a -n "$SSH_CLIENT" \) ] + set -g HOSTNAME_PROMPT (hostname) + end +end + +function prompt_shlv -d "Display level shell" + set pline '' + if [ "$VIMRUNTIME" != "" ] + set pline 'vim' + if [ "$SHLVL" -gt 3 ] + set pline 'vim:['$SHLVL']' + end + else + if [ "$SHLVL" -gt 2 ] + set pline '['$SHLVL']' + end + end + if [ $pline != '' ] + prompt_segment 8C8C8C black "$pline" + end +end + +function prompt_todo -d "Display todo" + set all (todo | wc -l) + set chkd (todo checked | wc -l) + set td (math "$all-$chkd") + + if [ $all -gt 0 ] + prompt_segment 5C5C5C blue "$td/$all" + end +end + + + + + +function prompt_dir -d "Display the current directory" + prompt_segment 1C1C1C FFFFFF (prompt_pwd) +end + +function git_status_summary -d "Deal with git status --porcelain" + awk ' + BEGIN { + untracked=0; + unstaged=0; + staged=0; + ahead=0; + behind=0; + } + { + if (!after_first && $0 ~ /^##.+/) { + if ( match($0, /ahead ([1-9]+)/, a) ) { + ahead=a[1]; + } + if ( match($0, /behind ([1-9]+)/, a) ) { + behind=a[1]; + } + } else if ($0 ~ /^\?\? .+/) { + untracked += 1 + } else { + if ($0 ~ /^.[^ ] .+/) { + unstaged += 1 + } + if ($0 ~ /^[^ ]. .+/) { + staged += 1 + } + } + after_first = 1 + } + END { + if (!seen_header) { + + } + print ahead ";" behind ";" untracked ";" unstaged ";" staged + }' +end + + +function prompt_git -d "Display the current git state" + set -l ref + if [ -e .git ] + set ref (command git symbolic-ref HEAD 2> /dev/null) + if [ $status -gt 0 ] + set -l branch (command git show-ref --head -s --abbrev |head -n1 2> /dev/null) + set ref "➦ $branch " + end + set branch_symbol \uE0A0 + set -l branch (echo $ref | sed "s-refs/heads/-$branch_symbol -") + + set -l BG PROMPT + + set dirty '' + set gstatus ( git status --porcelain -b | git_status_summary ) + + # Check for commit ahead + set ahead (echo $gstatus | cut -d ';' -f 1) + # Check for commit behind + set behind (echo $gstatus | cut -d ';' -f 2) + # Check for modified files + set unstdg (echo $gstatus | cut -d ';' -f 3) + # Check for untracked files + set untrkd (echo $gstatus | cut -d ';' -f 4) + # Check for staged files + set staged (echo $gstatus | cut -d ';' -f 5) + + if [ $ahead -gt 0 ] + set dirty $dirty'↑:'$ahead' ' + end + if [ $behind -gt 0 ] + set dirty $dirty'↓:'$behind' ' + end + if [ $untrkd -gt 0 ] + set dirty $dirty'U:'$untrkd' ' + end + if [ $unstdg -gt 0 ] + set dirty $dirty'?:'$unstdg' ' + end + if [ $staged -gt 0 ] + set dirty $dirty'S:'$staged' ' + end + + + if [ $staged -eq 0 -a $untrkd -eq 0 ] + set BG green + set PROMPT "$branch $dirty" + else + set BG yellow + + # Check if there's any commit in the repo + set -l empty 0 + git rev-parse --quiet --verify HEAD > /dev/null ^&1; or set empty 1 + + set -l target + if [ $empty = 1 ] + # The repo is empty + set dirty '' + set target '4b825dc642cb6eb9a060e54bf8d69288fbee4904' + + else + # The repo is not emtpy + set target 'HEAD' + + # Check for unstaged change only when the repo is not empty + set -l unstaged 0 + git diff --no-ext-diff --ignore-submodules=dirty --quiet --exit-code; or set unstaged 1 + if [ $unstaged = 1 ]; set dirty $dirty'●'; end + end + + # Check for staged change + set -l staged 0 + git diff-index --cached --quiet --exit-code --ignore-submodules=dirty $target; or set staged 1 + if [ $staged = 1 ]; set dirty $dirty'✚'; end + + # Check for dirty + if [ "$dirty" = "" ] + set PROMPT "$branch" + else + set PROMPT "$branch $dirty" + end + end + prompt_segment $BG black $PROMPT + end +end + + +function prompt_status -d "the symbols for a non zero exit status, root and background jobs" + if [ $RETVAL -ne 0 ] + prompt_segment black red "✘" + end + + # if superuser (uid == 0) + set -l uid (id -u $USER) + if [ $uid -eq 0 ] + prompt_segment black yellow "⚡" + end + + # Jobs display + if [ (jobs -l | wc -l) -gt 0 ] + prompt_segment black cyan "⚙" + end +end + +function available -a name -d "Check if a function or program is available." + type "$name" ^/dev/null >&2 +end + +function prompt_battery + set str (acpi | grep -oP 'Full|Charging|Discharging|\d+%|\d+:\d+' | tr --truncate-set1 '\n' ' ' | read charging percent time) + + if [ $time = "" ] + set time "====" + end + + if [ $charging = "Charging" ] + set charging "blue" + else if [ $charging = "Discharging" ] + set charging "green" + else + set charging "cyan" + end + + set percent $percent + + prompt_segment $charging white "$time $percent" +end + +function prompt_time + prompt_segment white black (date "+%H:%M:%S") +end + +# +# Prompt +# +function fish_prompt + set -g RETVAL $status + prompt_time + prompt_status + prompt_virtual_env + prompt_user + prompt_dir + prompt_todo + prompt_shlv + available git; and prompt_git + prompt_finish +end |