]> git.armaanb.net Git - admone.git/blob - admone.zsh
Move loose code
[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 SHORT_PROMPT="➤"
31 FORMAT_SHORT="%B%F{%(?.cyan.red)}"
32 TWO_LINE="0"
33
34 zstyle ':vcs_info:git:*' formats '%b%u%c'
35 zstyle ':vcs_info:git:*' actionformats '%b|%a%u%c'
36 zstyle ':vcs_info:*' unstagedstr ' *'
37 zstyle ':vcs_info:*' stagedstr ' +'
38
39 #######################################################################
40 # Functions
41 #######################################################################
42
43 admone-pwd() {
44   echo "%F{blue}%~%f"
45 }
46 admone-vcs() {
47   echo "%F{green}${vcs_info_msg_0_}%f"
48 }
49 admone-exit-code() {
50   ([[ $SHOW_0_EXIT_CODE == "1" ]] && echo "%(?,%F{cyan}%?%f,%F{red}%?%f)") ||
51     echo "%(?,,%F{red}%?%f)"
52 }
53 admone-date() {
54   echo $(date -I)
55 }
56 admone-12hr() {
57   echo $(date +%r)
58 }
59 admone-24hr() {
60   echo $(date +%T)
61 }
62
63 #######################################################################
64 # BACKEND
65 #######################################################################
66
67 # Cursor shape depends on vi mode
68 function zle-keymap-select zle-line-init zle-line-finish {
69   case $KEYMAP in
70     vicmd)
71       # Block
72       print -n -- "\E]50;CursorShape=0\C-G"
73       ;;
74     viins|main)
75       # Beam
76       print -n -- "\E]50;CursorShape=1\C-G"
77       ;;
78   esac
79   zle reset-prompt
80   zle -R
81 }
82
83 set-twoline-prompt() {
84   # Reset prompts
85   upper="${PRE_UPPER}"
86   lower="${PRE_LOWER}${FORMAT_LOWER}${PROMPT_CHAR}%f%b "
87
88   # Add in functions as defined above
89   upper+="${BLOCK_LEFT}$($THE_COMMAND)${BLOCK_RIGHT}"
90
91   for (( i = 0; i < $NUM_FUNCS; i++ )); do
92     THE_COMMAND="$(echo $INCLUDE | cut -d ';' -f $(($i + 2)))"
93     upper+="${BLOCK_SEPARATOR}${BLOCK_LEFT}$(${THE_COMMAND})${BLOCK_RIGHT}"
94   done
95
96   # Add line above
97   PROMPT=${upper}$'\n'${lower}
98 }
99
100 set-oneline-prompt() {
101   PROMPT="${FORMAT_LOWER}${PROMPT_CHAR}%f%b "
102   RPROMPT=""
103
104   for (( i = 0; i <= $NUM_FUNCS; i++ )); do
105     THE_COMMAND="$(echo $INCLUDE | cut -d ';' -f $(($i + 1)))"
106     RPROMPT+="${BLOCK_LEFT}$($THE_COMMAND)${BLOCK_RIGHT}"
107   done
108 }
109
110 # Set everything!
111 set-prompt() {
112   NUM_FUNCS="$(echo $INCLUDE | grep -o ';' | wc -l)"
113   THE_COMMAND="$(echo $INCLUDE | cut -d ';' -f 1)"
114
115   if [[ $TWO_LINE == "1" ]]; then
116     set-twoline-prompt
117   else
118     set-oneline-prompt
119   fi
120
121   [[ -v PS1_NL ]] && echo || PS1_NL=
122 }
123
124 if [[ ! $(echo $INCLUDE | grep -q "vcs") ]]; then
125   zstyle ':vcs_info:*' check-for-changes true
126   autoload -Uz add-zsh-hook vcs-info
127   add-zsh-hook precmd vcs_info
128 fi
129
130 autoload -Uz add-zsh-hook
131 add-zsh-hook precmd set-prompt
132
133 zle -N zle-line-init
134 zle -N zle-line-finish
135 zle -N zle-keymap-select