fish-shell/share/functions/__terlar_git_prompt.fish

99 lines
2.6 KiB
Fish
Raw Normal View History

2014-06-01 15:39:07 +08:00
set -g fish_color_git_clean green
set -g fish_color_git_staged yellow
set -g fish_color_git_dirty red
2014-06-01 15:39:07 +08:00
set -g fish_color_git_added green
set -g fish_color_git_modified blue
set -g fish_color_git_renamed magenta
set -g fish_color_git_copied magenta
set -g fish_color_git_deleted red
set -g fish_color_git_untracked yellow
set -g fish_color_git_unmerged red
2014-06-01 15:39:07 +08:00
set -g fish_prompt_git_status_added '✚'
set -g fish_prompt_git_status_modified '*'
set -g fish_prompt_git_status_renamed '➜'
set -g fish_prompt_git_status_copied '⇒'
set -g fish_prompt_git_status_deleted '✖'
set -g fish_prompt_git_status_untracked '?'
set -g fish_prompt_git_status_unmerged !
2012-11-14 05:50:51 +08:00
2014-06-01 15:39:07 +08:00
set -g fish_prompt_git_status_order added modified renamed copied deleted untracked unmerged
2012-11-14 05:50:51 +08:00
function __terlar_git_prompt --description 'Write out the git prompt'
# If git isn't installed, there's nothing we can do
# Return 1 so the calling prompt can deal with it
if not command -sq git
return 1
end
set -l branch (git rev-parse --abbrev-ref HEAD 2>/dev/null)
if test -z $branch
return
end
echo -n '|'
# Ignore untracked files unless we're explicitly asked.
# This is dog slow.
set -l untr -uno
set -q __fish_git_prompt_showuntrackedfiles
and set untr -unormal
set -l index (git -c core.fsmonitor= status --porcelain 2>/dev/null|cut -c 1-2|sort -u)
if test -z "$index"
set_color $fish_color_git_clean
echo -n $branch'✓'
set_color normal
return
end
set -l gs
set -l staged
2012-11-15 06:48:12 +08:00
for i in $index
if string match -rq '^[AMRCD]' -- $i
set staged 1
end
2012-11-15 06:48:12 +08:00
# HACK: To allow matching a literal `??` both with and without `?` globs.
set -l dq '??'
switch $i
case 'A '
set -a gs added
case 'M ' ' M'
set -a gs modified
case 'R '
set -a gs renamed
case 'C '
set -a gs copied
case 'D ' ' D'
set -a gs deleted
case "$dq"
set -a gs untracked
case 'U*' '*U' DD AA
set -a gs unmerged
end
end
if set -q staged[1]
set_color $fish_color_git_staged
else
set_color $fish_color_git_dirty
end
2012-11-15 06:48:12 +08:00
echo -n $branch'⚡'
2012-11-15 06:48:12 +08:00
for i in $fish_prompt_git_status_order
if contains $i in $gs
set -l color_name fish_color_git_$i
set -l status_name fish_prompt_git_status_$i
set_color $$color_name
echo -n $$status_name
end
2012-11-14 05:50:51 +08:00
end
set_color normal
end