summaryrefslogtreecommitdiff
path: root/functions/fish_prompt.fish
diff options
context:
space:
mode:
Diffstat (limited to 'functions/fish_prompt.fish')
-rw-r--r--functions/fish_prompt.fish333
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