Отображать содержимое под приглашением в командной строке?

Отображать содержимое под приглашением в командной строке?

Допустим, моя подсказка выглядит так (_ представляет мой курсор)

~ % _

Есть ли способ сделать так, чтобы это выглядело вот так?

~ % _
[some status]

Первоначально вопрос был о zsh, но теперь есть и другие ответы.

решение1

Следующие настройки, похоже, работают. Текст во второй строке исчезает, если командная строка выходит за пределы первой строки. Функция preexecстирает вторую строку перед выполнением команды; если вы хотите ее сохранить, измените на preexec () { echo; }.

terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }

%Выходы из ситуации описаны в руководстве zsh ( man zshmisc).

Terminfo — это API доступа к терминалу. Zsh имеет terminfoмодуль, который предоставляет доступ к базе данных описания терминала: $terminfo[$cap]— это последовательность символов, которую нужно отправить для проверки возможностей терминала $cap, т. е. для запуска его $capкоманды. См. man 5 terminfo(в Linux номер раздела может отличаться в других системах) для получения дополнительной информации.

Последовательность действий следующая: переместить курсор на одну строку вниз ( cud1), затем вернуться назад ( cuu1); сохранить позицию курсора ( sc); переместить курсор на одну строку вниз; напечатать [some status]; восстановить позицию курсора. Бит «вниз-вверх» в начале необходим только в том случае, если приглашение находится в нижней строке экрана. Строка preexec стирает вторую строку ( el), чтобы она не смешивалась с выводом команды.

Если текст на второй строке шире терминала, дисплей может быть искажен. Используйте Ctrl+ Lв крайнем случае для исправления.

решение2

Вот bashэквивалент решения Жиля zsh. Bash не имеет собственного модуля terminfo, но tputкоманда (в комплекте с terminfo) делает почти то же самое.

PS1_line1='\w \$ '
PS1_line2='[some status]'

if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
    PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
    PS2="\[$(tput el)\]> "
    trap 'tput el' DEBUG
else
    PS1="$PS1_line2 :: $PS1_line1"
fi

Если терминал не поддерживает одну из возможностей, он вернется к однострочному приглашению.

Строка trapпредставляет собой хакерский способ эмулировать preexecфункцию zsh. Смотритеhttps://superuser.com/questions/175799/для получения дополнительной информации.

РЕДАКТИРОВАТЬ: Улучшенный сценарий на основе комментариев Жиля.

Связанный контент