]> git.armaanb.net Git - admone.git/blob - admone.zsh
Add oneline option
[admone.git] / admone.zsh
1 # Admone Zsh prompt
2 # Copyright Armaan Bhojwani 2021 <me@armaanb.net>
3 # MIT licensed, see the LICENSE file for more information.
4
5 #######################################################################
6 # USER CONFIGURATIONS
7 #######################################################################
8
9 PROMPT_CHAR="➤"
10   # PROMPT_CHAR="❯❯❯"
11   # PROMPT_CHAR="$"
12   # PROMPT_CHAR="%"
13   # PROMPT_CHAR=">"
14   # PROMPT_CHAR="➢"
15   # PROMPT_CHAR="➪"
16 PRE_UPPER="╭"
17 PRE_LOWER="╰"
18   # PRE_UPPER="┌"
19   # PRE_LOWER="└"
20 BLOCK_SEPARATOR="─"
21   # BLOCK_SEPARATOR="∙"
22 BLOCK_LEFT="["
23 BLOCK_RIGHT="]"
24   # BLOCK_LEFT="("
25   # BLOCK_RIGHT=")"
26 SHOW_0_EXIT_CODE="1"
27 INCLUDE="admone-pwd;admone-vcs;admone-exit-code"
28 FORMAT_LOWER="%B%F{%(?.cyan.red)}"
29
30 TRANSIENT_PROMPT="0" # This is buggy
31 SHORT_PROMPT="➤"
32 FORMAT_SHORT="%B%F{%(?.cyan.red)}"
33 TWO_LINE="0"
34
35 zstyle ':vcs_info:git:*' formats '%b%u%c'
36 zstyle ':vcs_info:git:*' actionformats '%b|%a%u%c'
37 zstyle ':vcs_info:*' unstagedstr ' *'
38 zstyle ':vcs_info:*' stagedstr ' +'
39
40 #######################################################################
41 # Functions
42 #######################################################################
43
44 admone-pwd() {
45   echo "%F{blue}%~%f"
46 }
47 admone-vcs() {
48   echo "%F{green}${vcs_info_msg_0_}%f"
49 }
50 admone-exit-code() {
51   ([[ $SHOW_0_EXIT_CODE == "1" ]] && echo "%(?,%F{cyan}%?%f,%F{red}%?%f)") ||
52     echo "%(?,,%F{red}%?%f)"
53 }
54 admone-date() {
55   echo $(date -I)
56 }
57 admone-12hr() {
58   echo $(date +%r)
59 }
60 admone-24hr() {
61   echo $(date +%T)
62 }
63
64 #######################################################################
65 # BACKEND
66 #######################################################################
67
68 # Cursor shape depends on vi mode
69 function zle-keymap-select zle-line-init zle-line-finish {
70   case $KEYMAP in
71     vicmd)
72       # Block
73       print -n -- "\E]50;CursorShape=0\C-G"
74       ;;
75     viins|main)
76       # Beam
77       print -n -- "\E]50;CursorShape=1\C-G"
78       ;;
79   esac
80   zle reset-prompt
81   zle -R
82 }
83
84 NUM_FUNCS="$(echo $INCLUDE | grep -o ';' | wc -l)"
85 THE_COMMAND="$(echo $INCLUDE | cut -d ';' -f 1)"
86 [[ -v PS1_NL ]] && echo || PS1_NL=
87
88 set-twoline-prompt() {
89   # Reset prompts
90   upper="${PRE_UPPER}"
91   lower="${PRE_LOWER}${FORMAT_LOWER}${PROMPT_CHAR}%f%b "
92
93   # Add in functions as defined above
94   upper+="$BLOCK_LEFT$($THE_COMMAND)$BLOCK_RIGHT"
95
96   for (( i = 0; i < $NUM_FUNCS; i++ )); do
97     THE_COMMAND="$(echo $INCLUDE | cut -d ';' -f $(($i + 2)))"
98     upper+="$BLOCK_SEPARATOR$BLOCK_LEFT$($THE_COMMAND)$BLOCK_RIGHT"
99   done
100
101   # Add line above
102   PROMPT=$upper$'\n'$lower
103 }
104
105 set-oneline-prompt() {
106   PROMPT="${FORMAT_LOWER}${PROMPT_CHAR}%f%b "
107   RPROMPT=""
108
109   for (( i = 0; i <= $NUM_FUNCS; i++ )); do
110     THE_COMMAND="$(echo $INCLUDE | cut -d ';' -f $(($i + 1)))"
111     RPROMPT+="$BLOCK_LEFT$($THE_COMMAND)$BLOCK_RIGHT"
112   done
113 }
114 # Set everything!
115 set-prompt() {
116   if [[ $TWO_LINE == "1" ]]; then
117     set-twoline-prompt
118   else
119     set-oneline-prompt
120   fi
121 }
122
123 if [[ $TRANSIENT_PROMPT == "1" ]]; then
124   SHORT_PROMPT=$FORMAT_SHORT$SHORT_PROMPT' '%f%b
125
126   set-transient-prompt() {
127     if [[ $PROMPT != $SHORT_PROMPT ]]; then
128       PROMPT=$SHORT_PROMPT
129       zle .reset-prompt
130     fi
131   }
132
133   zle-line-finish() {
134     set-transient-prompt
135   }
136
137   trap 'set-transient-prompt; return 130' INT
138 fi
139
140 if [[ ! $(echo $INCLUDE | grep -q "vcs") ]]; then
141   zstyle ':vcs_info:*' check-for-changes true
142   autoload -Uz add-zsh-hook vcs-info
143   add-zsh-hook precmd vcs_info
144 fi
145
146 autoload -Uz add-zsh-hook
147 add-zsh-hook precmd set-prompt
148
149 zle -N zle-line-init
150 zle -N zle-line-finish
151 zle -N zle-keymap-select