Files
dotfiles/fish/files/functions/fish_prompt.fish
T

174 lines
4.8 KiB
Fish

# Custom Fish prompt - simple version
# Configure via: prompt-config
function _prompt_git_branch
git branch --show-current 2>/dev/null
end
function _prompt_git_icon
set -l remotes (git remote -v 2>/dev/null | awk '{print $2}')
test -z "$remotes"; and return
for remote in $remotes
if not string match -q "*github.com*" $remote
printf '\ue702'
return
end
end
printf '\uf113'
end
function _prompt_git_status
git rev-parse --git-dir >/dev/null 2>&1; or return
set -l staged (git diff --cached --numstat 2>/dev/null | wc -l)
set -l modified (git diff --numstat 2>/dev/null | wc -l)
set -l untracked (git ls-files --others --exclude-standard 2>/dev/null | wc -l)
set -l stashed (git stash list 2>/dev/null | wc -l)
set -l ahead_behind (git rev-list --left-right --count @{upstream}...HEAD 2>/dev/null)
set -l ahead (echo $ahead_behind | awk '{print $2}')
set -l behind (echo $ahead_behind | awk '{print $1}')
set -l status_parts
if test "$staged" -gt 0
set status_parts $status_parts "++($staged)"
end
if test "$modified" -gt 0
set status_parts $status_parts "!($modified)"
end
if test "$untracked" -gt 0
set status_parts $status_parts "?($untracked)"
end
if test "$stashed" -gt 0
set status_parts $status_parts "\$"
end
if test -n "$ahead" -a "$ahead" -gt 0
if test -n "$behind" -a "$behind" -gt 0
set status_parts $status_parts "⇕[⇡($ahead)⇣($behind)]"
else
set status_parts $status_parts "⇡($ahead)"
end
else if test -n "$behind" -a "$behind" -gt 0
set status_parts $status_parts "⇣($behind)"
end
if test -z "$status_parts"
echo "✓"
else
string join "" $status_parts
end
end
function _prompt_mode_text
switch $fish_bind_mode
case default
echo "N"
case insert
echo "I"
case visual
echo "V"
case replace-one
echo "R"
case '*'
echo "$fish_bind_mode"
end
end
function _prompt_mode_color
switch $fish_bind_mode
case default
echo $prompt_color_error
case insert
echo $prompt_color_tertiary_fixed
case visual
echo $prompt_color_primary_fixed
case replace-one
echo $prompt_color_error
case '*'
echo $prompt_color_tertiary_fixed
end
end
function fish_prompt
# keep vertical spacing consistent (including empty Enter)
echo
_prompt_config
set -l bg $prompt_color_surface
set -l left_parts
# vi mode indicator pill on left
set -l mode_text (_prompt_mode_text)
set -l mode_color (_prompt_mode_color)
set left_parts $left_parts (_prompt_segment "$mode_text" $bg $mode_color)
# Username
if test "$prompt_show_username" = true
set left_parts $left_parts (_prompt_segment "$prompt_user_symbol $USER" $bg $prompt_color_tertiary_fixed)
end
# Directory
set -l dir (_prompt_directory)
set left_parts $left_parts (_prompt_segment "$dir" $bg $prompt_color_primary)
# Git branch with dynamic icon
set -l branch (_prompt_git_branch)
if test -n "$branch"
set -l git_icon (_prompt_git_icon)
set left_parts $left_parts (_prompt_segment "$git_icon $branch" $bg $prompt_color_primary_fixed)
end
# Git status
set -l git_status (_prompt_git_status)
if test -n "$git_status"
set -l fg_color $prompt_color_error
if test "$git_status" = "✓"
set fg_color $prompt_color_tertiary_fixed
end
set left_parts $left_parts (_prompt_segment "$git_status" $bg $fg_color)
end
set -l left_line (string join " " $left_parts)
# Right-aligned time pill
set -l right_line ""
if test "$prompt_show_time" = true
set -l time_str (date "+$prompt_time_format")
set right_line (_prompt_segment "󰴈 $time_str" $bg $prompt_color_secondary)
end
if test -n "$right_line"
set -l cols $COLUMNS
test -z "$cols"; and set cols (tput cols 2>/dev/null)
test -z "$cols"; and set cols 80
set -l left_width (string length -V -- $left_line)
set -l right_width (string length -V -- $right_line)
set -l gap (math $cols - $left_width - $right_width)
if test $gap -lt 1
set gap 1
end
set -l spaces (string repeat -n $gap " ")
echo "$left_line$spaces$right_line"
else
echo $left_line
end
# Second line: input prompt
set -l tertiary_clean (string replace -a "#" "" $prompt_color_tertiary)
set tertiary_clean (string replace -a '"' '' $tertiary_clean)
set_color $tertiary_clean
echo -n "$prompt_symbol "
set_color normal
end