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.
This commit is contained in:
parent
3978f2b1c2
commit
63b7170ccb
@ -27,9 +27,11 @@ prompt_fresh_setup() {
|
|||||||
if [ $almostontop -eq 1 ]; then
|
if [ $almostontop -eq 1 ]; then
|
||||||
# Hook to clear the screen then prints the prompt with previous command at
|
# Hook to clear the screen then prints the prompt with previous command at
|
||||||
# the top of the screen.
|
# 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
|
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
|
fi
|
||||||
|
|
||||||
[ $recompile -eq 1 ] && prompt_cleanup
|
[ $recompile -eq 1 ] && prompt_cleanup
|
||||||
@ -128,7 +130,20 @@ fresh_line_one() {
|
|||||||
print -P "$time_stamp $directory$git$py$docker$result"
|
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[<row>;<column>R
|
||||||
|
printf "\033[6n"
|
||||||
|
# Discard prefix delimited by [
|
||||||
|
read -s -d [
|
||||||
|
# Store the <row> 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[<row>;<column>R
|
# CSI ESC[6n gets the cursor position in the form ESC[<row>;<column>R
|
||||||
printf "\033[6n"
|
printf "\033[6n"
|
||||||
# Discard prefix delimited by [
|
# Discard prefix delimited by [
|
||||||
@ -141,14 +156,16 @@ fresh_almostontop() {
|
|||||||
# CSI ESC[<num>B moves the cursor down <num> lines
|
# CSI ESC[<num>B moves the cursor down <num> lines
|
||||||
let "down = $LINES - $row"
|
let "down = $LINES - $row"
|
||||||
printf "\033[${down}B"
|
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
|
# 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
|
for (( i = 0; i < $new; i++ )); do
|
||||||
printf "\n"
|
printf "\n"
|
||||||
done
|
done
|
||||||
# Move the cursor to the line below the prompt
|
# Move the cursor to the line below the prompt
|
||||||
# CSI ESC[<num>A moves the cursor up <num> lines
|
# CSI ESC[<num>A moves the cursor up <num> lines
|
||||||
let "up = $LINES - 3"
|
let "up = $LINES - $prompt_lines"
|
||||||
printf "\033[${up}A"
|
printf "\033[${up}A"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user