Допустим, моя подсказка выглядит так (_ обозначает мой курсор)
~ % _
Могу ли я сделать так, чтобы это выглядело так
~ % _
[some status]
Первоначально вопрос был о zsh, но теперь есть другие ответы.
Допустим, моя подсказка выглядит так (_ обозначает мой курсор)
~ % _
Могу ли я сделать так, чтобы это выглядело так
~ % _
[some status]
Первоначально вопрос был о zsh, но теперь есть другие ответы.
Ответы:
Следующие настройки, кажется, работают. Текст во второй строке исчезает, если командная строка выходит за пределы первой строки. 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в крайнем случае для ремонта.
Здесь 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/ для получения дополнительной информации.
РЕДАКТИРОВАТЬ : Улучшенный скрипт на основе комментариев Жиля.