Моим первым побуждением было ответить, что нет способа заморозить прокручиваемую область раз и навсегда, поскольку любая программа, управляющая терминалом (как это делает vim), может переопределить ваши настройки. Однако потом я понял, что вы можете восстановить настройки с помощью функции подсказки оболочки. Для этого необходимо добавить последовательность управления терминалом в переменную окружения PS1
.
Я изменил вашу функцию, чтобы она автоматически обновляла подсказку при первом вызове. Для этого мне пришлось разделить его на две функции.
bottomLineTermCtlSeq() {
#clear
# Save cursor position
tput sc
# Add a new line
tput il 1
# Change scroll region to exclude the last lines
tput csr 0 $(($(tput lines) - 3))
# Move cursor to bottom line
tput cup $(tput lines) 0
# Clear to the end of the line
tput el
# Echo the content on that row
cat "${BOTTOM_LINE_CONTENT_FILE}"
# Restore cursor position
tput rc
}
bottomLine() {
local bottomLinePromptSeq='\[$(bottomLineTermCtlSeq)\]'
if [[ "$PS1" != *$bottomLinePromptSeq* ]]
then
PS1="$bottomLinePromptSeq$PS1"
fi
if [ -z "$BOTTOM_LINE_CONTENT_FILE" ]
then
export BOTTOM_LINE_CONTENT_FILE="$(mktemp --tmpdir bottom_line.$$.XXX)"
fi
echo -ne "$@" > "$BOTTOM_LINE_CONTENT_FILE"
bottomLineTermCtlSeq
}
Я храню текущее содержимое нижней строки в файле, а не в переменной окружения, чтобы подпроцессы оболочки верхнего уровня могли также манипулировать нижней строкой.
Обратите внимание, что я удалил команду clear
из последовательности операций с терминалом, что означает, что вам может потребоваться вызвать ее самостоятельно перед первым вызовом bottomLine
(когда вы вызываете ее, когда достигли нижней части вашего терминала). экран).
Также обратите внимание, что нижняя строка может быть испорчена при изменении размера окна терминала.