Files
ubuntu-fish-dotfiles/fish/theme-t31m/functions/fish_prompt.fish
T31M 36ec3bb485 (bugfix) make compatible with fish version >=3.3
- cleanup
- minor comments and fixes
2022-04-30 11:31:57 +02:00

156 lines
3.2 KiB
Fish

# Colors
function orange
set_color -o ee5819
end
function yellow
set_color -o b58900
end
function red
set_color -o d30102
end
function cyan
set_color -o 2aa198
end
function white
set_color -o fdf6e3
end
function dim
set_color -o 4f4f4f
end
function off
set_color -o normal
end
# Git
function git::is_repo
test -d .git; or command git rev-parse --git-dir >/dev/null 2>/dev/null
end
function git::ahead -a ahead behind diverged none
not git::is_repo; and return
set -l commit_count (command git rev-list --count --left-right "@{upstream}...HEAD" 2>/dev/null)
switch "$commit_count"
case ""
# no upstream
case "0"\t"0"
test -n "$none"; and echo "$none"; or echo ""
case "*"\t"0"
test -n "$behind"; and echo "$behind"; or echo "-"
case "0"\t"*"
test -n "$ahead"; and echo "$ahead"; or echo "+"
case "*"
test -n "$diverged"; and echo "$diverged"; or echo "±"
end
end
function git::branch_name
git::is_repo; and begin
command git symbolic-ref --short HEAD 2>/dev/null;
or command git show-ref --head -s --abbrev | head -n1 2>/dev/null
end
end
function git::is_dirty
git::is_repo; and not command git diff --no-ext-diff --quiet --exit-code
end
function git::is_staged
git::is_repo; and begin
not command git diff --cached --no-ext-diff --quiet --exit-code
end
end
function git::is_stashed
git::is_repo; and begin
command git rev-parse --verify --quiet refs/stash >/dev/null
end
end
function git::is_touched
git::is_repo; and begin
test -n (echo (command git status --porcelain))
end
end
function git::untracked
git::is_repo; and begin
command git ls-files --other --exclude-standard
end
end
function fish_prompt
set -l symbol "λ "
set -l code $status
set t31m_custom_left (t31m_prompt_left)
echo -ns "$t31m_custom_left"
if test -n "$ssh_client"
set -l host (hostname -s)
set -l who (whoami)
echo -n -s (red)"("(cyan)"$who"(red)":"(cyan)"$host"(red)") "(off)
end
if git::is_repo
set -l branch (git::branch_name 2>/dev/null)
set -l ref (git show-ref --head --abbrev | awk '{print substr($0,0,7)}' | sed -n 1p)
printf '%s ' \U1F6E0
echo -n -s (red)"("(off)
if git::is_stashed
echo -n -s (white)"^"(off)
end
if git::is_dirty
printf (white)"*"(off)
end
if command git symbolic-ref HEAD > /dev/null 2>/dev/null
if git::is_staged
printf (cyan)"$branch"(off)
else
printf (yellow)"$branch"(off)
end
else
printf (dim)"$ref"(off)
end
for remote in (git remote)
set -l behind_count (echo (command git rev-list $branch..$remote/$branch 2>/dev/null | wc -l | tr -d " "))
set -l ahead_count (echo (command git rev-list $remote/$branch..$branch 2>/dev/null | wc -l | tr -d " "))
if test $ahead_count -ne 0; or test $behind_count -ne 0; and test (git remote | wc -l) -gt 1
echo -n -s " "(orange)$remote(off)
end
if test $ahead_count -ne 0
echo -n -s (white)" +"$ahead_count(off)
end
if test $behind_count -ne 0
echo -n -s (white)" -"$behind_count(off)
end
end
echo -n -s (red)")"(off)
end
set t31m_custom (t31m_prompt)
# check if latest cmd resulted in exit code 0 (ok)
if test "$code" = 0
echo -e -n -s "$t31m_custom"(red)"\n$symbol"(off)
else
echo -e -n -s "$t31m_custom"(dim)"\n$symbol"(off)
end
end