summaryrefslogtreecommitdiff
path: root/.config/fish/functions/fish_prompt.fish
blob: 1e5e7229f9b5631e74322d9f13f1297f1dab4c73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
function fish_prompt
        set -l __last_command_exit_status $status
    
        if not set -q -g __fish_arrow_functions_defined
                set -g __fish_arrow_functions_defined
                function _git_branch_name
                        set -l branch (git symbolic-ref --quiet HEAD 2>/dev/null)
                        if set -q branch[1]
                                echo (string replace -r '^refs/heads/' '' $branch)
                        else
                                echo (git rev-parse --short HEAD 2>/dev/null)
                        end
                end
        
                function _is_git_dirty
                        not command git diff-index --cached --quiet HEAD -- &>/dev/null
                        or not command git diff --no-ext-diff --quiet --exit-code &>/dev/null
                end
        
                function _is_git_repo
                        type -q git
                        or return 1
                        git rev-parse --git-dir >/dev/null 2>&1
                end
        
                function _hg_branch_name
                        echo (hg branch 2>/dev/null)
                end
        
                function _is_hg_dirty
                        set -l stat (hg status -mard 2>/dev/null)
                        test -n "$stat"
                end
        
                function _is_hg_repo
                        fish_print_hg_root >/dev/null
                end
        
                function _repo_branch_name
                        _$argv[1]_branch_name
                end
        
                function _is_repo_dirty
                        _is_$argv[1]_dirty
                end
        
                function _repo_type
                        if _is_hg_repo
                                echo hg
                                return 0
                        else if _is_git_repo
                                echo git
                                return 0
                        end
                        return 1
                end
        end
    
        set -l cyan (set_color -o cyan)
        set -l yellow (set_color -o yellow)
        set -l red (set_color -o red)
        set -l green (set_color -o green)
        set -l blue (set_color -o blue)
        set -l normal (set_color normal)
    
        set -l arrow_color "$green"
        if test $__last_command_exit_status != 0
                set arrow_color "$red"
        end
    
        set -l arrow "$arrow_color➜ "
        if fish_is_root_user
                set arrow "$arrow_color# "
        end
    
        set -l cwd $yellow(prompt_pwd)
    
        set -l repo_info
        if set -l repo_type (_repo_type)
                set -l repo_branch $red(_repo_branch_name $repo_type)
                set repo_info "$cyan $repo_type:($repo_branch$cyan)"
        
                if _is_repo_dirty $repo_type
                        set -l dirty "$yellow ✗"
                        set repo_info "$repo_info$dirty"
                end
        end
    
        echo $arrow $cwd $repo_info $normal
        # echo $arrow
end