Enable transient prompt in zsh

Amolith created

Change summary

dot_config/zsh/private_dot_zshrc.tmpl | 55 +++++++++++++++++++++++++++++
1 file changed, 55 insertions(+)

Detailed changes

dot_config/zsh/private_dot_zshrc.tmpl 🔗

@@ -237,6 +237,61 @@ source $XDG_CONFIG_HOME/zsh/completions/antidot.zsh
 source $XDG_CONFIG_HOME/zsh/completions/klog.zsh
 source $XDG_CONFIG_HOME/zsh/completions/chezmoi.zsh
 
+eval "$(starship init zsh)"
+
+precmd_functions=(zvm_init "${(@)precmd_functions:#zvm_init}")
+precmd_functions+=(set-long-prompt)
+zvm_after_init_commands+=("zle -N zle-line-finish; zle-line-finish() { set-short-prompt }")
+
+set-long-prompt() {
+    PROMPT=$(starship prompt)
+    RPROMPT=""
+}
+
+export COLUMNS=$(($COLUMNS + ($COLUMNS*0.1)))
+set-short-prompt() {
+    # setting this doesn't seem to actually work
+    PROMPT="$(STARSHIP_KEYMAP=${KEYMAP:-viins} starship module character)"
+    RPROMPT=$'%{\e[999C%}\e[8D%F{8}%*%f ' # remove if you don't want right prompt
+    zle .reset-prompt 2>/dev/null # hide the errors on ctrl+c
+}
+
+zle-keymap-select() {
+    set-short-prompt
+}
+zle -N zle-keymap-select
+
+zle-line-finish() { set-short-prompt }
+zle -N zle-line-finish
+
+trap 'set-short-prompt; return 130' INT
+
+# try to fix vi mode indication (not working 100%)
+zvm_after_init_commands+=('
+  function zle-keymap-select() {
+    if [[ ${KEYMAP} == vicmd ]] ||
+       [[ $1 = "block" ]]; then
+      echo -ne "\e[1 q"
+      STARSHIP_KEYMAP=vicmd
+    elif [[ ${KEYMAP} == main ]] ||
+         [[ ${KEYMAP} == viins ]] ||
+         [[ ${KEYMAP} = "" ]] ||
+         [[ $1 = "beam" ]]; then
+      echo -ne "\e[5 q"
+      STARSHIP_KEYMAP=viins
+    fi
+    zle reset-prompt
+  }
+  zle -N zle-keymap-select
+
+  # Ensure vi mode is set
+  zle-line-init() {
+    zle -K viins
+    echo -ne "\e[5 q"
+  }
+  zle -N zle-line-init
+')
+
 # Configure history file
 export HISTFILE="$XDG_STATE_HOME"/zsh/history
 export HISTSIZE=1000000