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