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