Следующий код (использует функции zsh, но при этом можно использовать и другие оболочки), определяет две функции оболочки: prompt_middle
и prompt_restore
.
Первая функция держит подсказку всегда выше середины терминала, форсируя соответствующее количество пустых строк под подсказкой. Последняя функция восстанавливает нормальное поведение.
Вы можете назначить эти функции некоторым ярлыкам или использовать некоторую логику для переключения между этими двумя режимами.
# load terminfo modules to make the associative array $terminfo available
zmodload zsh/terminfo
# save current prompt to parameter PS1o
PS1o="$PS1"
# calculate how many lines one half of the terminal's height has
halfpage=$((LINES/2))
# construct parameter to go down/up $halfpage lines via termcap
halfpage_down=""
for i in {1..$halfpage}; do
halfpage_down="$halfpage_down$terminfo[cud1]"
done
halfpage_up=""
for i in {1..$halfpage}; do
halfpage_up="$halfpage_up$terminfo[cuu1]"
done
# define functions
function prompt_middle() {
# print $halfpage_down
PS1="%{${halfpage_down}${halfpage_up}%}$PS1o"
}
function prompt_restore() {
PS1="$PS1o"
}
Лично вместо переключения между двумя режимами я бы использовал гораздо более простой подход (вам нужны определения $halfpage_up/down
сверху):
magic-enter () {
if [[ -z $BUFFER ]]
then
print ${halfpage_down}${halfpage_up}$terminfo[cuu1]
zle reset-prompt
else
zle accept-line
fi
}
zle -N magic-enter
bindkey "^M" magic-enter
Это проверяет, является ли текущая командная строка пустой (см. Мой другой ответ), и если это так, переместите подсказку до середины терминала. Теперь вы можете перемотать вашу подсказку еще одним нажатием ENTER
(или, возможно, вы хотите вызвать ее дважды, аналогично двойному щелчку).