diff --git a/prompt_fresh_setup b/prompt_fresh_setup index 47d8db0..ce8a641 100644 --- a/prompt_fresh_setup +++ b/prompt_fresh_setup @@ -27,9 +27,11 @@ prompt_fresh_setup() { if [ $almostontop -eq 1 ]; then # Hook to clear the screen then prints the prompt with previous command at # the top of the screen. - add-zsh-hook preexec fresh_almostontop + add-zsh-hook precmd fresh_almostontop_precmd + add-zsh-hook preexec fresh_almostontop_preexec else - add-zsh-hook -d preexec fresh_almostontop + add-zsh-hook -d preexec fresh_almostontop_preexec + add-zsh-hook -d precmd fresh_almostontop_precmd fi [ $recompile -eq 1 ] && prompt_cleanup @@ -128,7 +130,20 @@ fresh_line_one() { print -P "$time_stamp $directory$git$py$docker$result" } -fresh_almostontop() { +# Executed before each prompt. +fresh_almostontop_precmd() { + # CSI ESC[6n gets the cursor position in the form ESC[;R + printf "\033[6n" + # Discard prefix delimited by [ + read -s -d [ + # Store the delimited by ; in row_before + read -s -d \; row_before + # Discard suffix delimted by R otherwise it is output to the tty + read -s -d R +} + +# Executed just after a command has been read and is about to be executed. +fresh_almostontop_preexec() { # CSI ESC[6n gets the cursor position in the form ESC[;R printf "\033[6n" # Discard prefix delimited by [ @@ -141,14 +156,16 @@ fresh_almostontop() { # CSI ESC[B moves the cursor down lines let "down = $LINES - $row" printf "\033[${down}B" + # Calculate the number of lines in the prompt + let "prompt_lines = ($row - $row_before) + 2" # Print new lines to push the old command out of view - let "new = $row - 3" + let "new = $row - $prompt_lines" for (( i = 0; i < $new; i++ )); do printf "\n" done # Move the cursor to the line below the prompt # CSI ESC[A moves the cursor up lines - let "up = $LINES - 3" + let "up = $LINES - $prompt_lines" printf "\033[${up}A" }