Показывать вещи под приглашением в приглашении оболочки?

21

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

~ % _

Могу ли я сделать так, чтобы это выглядело так

~ % _
[some status]

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

xenoterracide
источник
Как насчет экрана + buobu ?: launchpad.net/byobu , и , возможно , kmandla.wordpress.com/2010/01/03/... для снятия скриншотов
Янус

Ответы:

17

Следующие настройки, кажется, работают. Текст во второй строке исчезает, если командная строка выходит за пределы первой строки. 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в крайнем случае для ремонта.

Жиль "ТАК - перестань быть злым"
источник
5

Здесь 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Линия является Hacky способ эмулировать ЗШ в preexecфункции. См. Https://superuser.com/questions/175799/ для получения дополнительной информации.

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

Jander
источник
@ Жиль: Спасибо за вклад! Я думаю, что теперь у меня все работает лучше. Пробовал bash 4.1.5 в gnome-терминал и xterm, и bash 3.2.48 в OSX Terminal.
Jander