174 lines
4.8 KiB
Fish
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
|