From 63b7170ccb380d9986cc3e2e0b226db1a9c17394 Mon Sep 17 00:00:00 2001 From: "Kenneth Benzie (Benie)" Date: Tue, 7 Dec 2021 16:56:08 +0000 Subject: [PATCH] Fix bug in almostontop that truncated long prompts Add collection of cursor line immediately after the previous command completes and use this when calculating the number of lines required to move the screen in order to display only the latest prompt. --- prompt_fresh_setup | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) 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" }