summaryrefslogtreecommitdiff
path: root/config/fish/functions/fish_prompt.fish
blob: c45066c1a33f9c92d948e76d94ff8eeaa0c159e7 (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# vim: set ft=sh:

# Pure
# by Rafael Rinaldi
# https://github.com/rafaelrinaldi/pure
# MIT License

# Whether or not is a fresh session
set -g fresh_session 1

# Symbols

set -g symbol_prompt "❯"
set -g symbol_git_down_arrow "⇣"
set -g symbol_git_up_arrow "⇡"
set -g symbol_git_dirty "*"
set -g symbol_horizontal_bar "—"

# Colors

set -g color_red (set_color red)
set -g color_green (set_color green)
set -g color_blue (set_color blue)
set -g color_yellow (set_color yellow)
set -g color_cyan (set_color cyan)
set -g color_gray (set_color 93A1A1)
set -g color_normal (set_color normal)

function fish_prompt
  # Save previous exit code
  set -l exit_code $status

  # Set default color symbol to green meaning it's all good!
  set -l color_symbol $color_green

  # Template

  set -l current_folder (__parse_current_folder)
  set -l git_branch_name ""
  set -l git_dirty ""
  set -l git_arrows ""
  set -l command_duration ""
  set -l prompt ""

  # Do not add a line break to a brand new session
  if test $fresh_session -eq 0
    set prompt $prompt "\n"
  end

  # Prompt failed command execution duration
  set command_duration (__format_time $CMD_DURATION)

  # Format current folder on prompt output
  set prompt $prompt "$color_yellow$command_duration$color_blue$current_folder$color_normal "

  # Handle previous failed command
  if test $exit_code -ne 0
    # Symbol color is red when previous command fails
    set color_symbol $color_red

    set prompt $prompt "$color_yellow$command_duration$color_normal"
  end

  # Exit with code 1 if git is not available
  if not which git >/dev/null
    return 1
  end

  # Check if is on a Git repository
  set -l is_git_repository (command git rev-parse --is-inside-work-tree ^/dev/null)

  if test -n "$is_git_repository"
    set git_branch_name (__parse_git_branch)

    # Check if there are files to commit
    set -l is_git_dirty (command git status --porcelain --ignore-submodules ^/dev/null)

    if test -n "$is_git_dirty"
      set git_dirty $symbol_git_dirty
    end

    # Check if there is an upstream configured
    command git rev-parse --abbrev-ref '@{upstream}' >/dev/null ^&1; and set -l has_upstream
    if set -q has_upstream
      set -l git_status (command git rev-list --left-right --count 'HEAD...@{upstream}' | sed "s/[[:blank:]]/ /" ^/dev/null)

      # Resolve Git arrows by treating `git_status` as an array
      set -l git_arrow_left (command echo $git_status | cut -c 1 ^/dev/null)
      set -l git_arrow_right (command echo $git_status | cut -c 3 ^/dev/null)

    # If arrow is not "0", it means it's dirty
      if test $git_arrow_left -ne "0"
        set git_arrows $symbol_git_up_arrow
      end

      if test $git_arrow_right -ne "0"
        set git_arrows $git_arrows$symbol_git_down_arrow
      end
    end

    # Format Git prompt output
    set prompt $prompt "$color_gray$git_branch_name$git_dirty$color_normal\t$color_cyan$git_arrows$color_normal"
  end

  set prompt $prompt "\n$color_symbol$symbol_prompt$color_normal "

  echo -e -s $prompt

  set fresh_session 0
end