Вы ничего не должны делать на самом деле; псевдонимы делают это автоматически. Например:
$ alias less="less -eirqM"
$ less foo.txt
Вы будете видеть первую страницу foo.txt, и less
выйдет в EOF (-e), поиски будут нечувствительны к регистру (-i) и т.д.
Следующие настройки, кажется, работают. Текст на второй строке исчезает, если командная строка переполняет первой строки. 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]; }
%
Escape документируются в zsh руководство (man zshmisc
).
Terminfo является терминальным доступом API. Zsh имеет a terminfo
модуль, который предоставляет доступ к терминальной базе данных описания: $terminfo[$cap]
последовательность символов для отправки для осуществления возможности терминала $cap
, т.е. выполнять $cap
команда. Посмотрите man 5 terminfo
(на Linux число раздела может варьироваться на других нельдах), для получения дополнительной информации.
Последовательность действий: переместите курсор вниз одна строка (cud1
), затем обратно (cuu1
); сохраните позицию курсора (sc
); переместите курсор вниз одна строка;печать [some status]
; восстановите позицию курсора. Ниже на бит вначале только необходимо в случае, если подсказка находится на нижней строке экрана. Предысполнительная строка стирает вторую строку (el
) так, чтобы это не становилось путавшим с выводом от команды.
Если текст на второй строке более широк, чем терминал, дисплей может быть искажен. Используйте Ctrl+L в повышении для восстановления.
Вот a bash
эквивалентный из zsh решения Gilles. 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 способом эмулировать zsh's preexec
функция. См. https://superuser.com/questions/175799/для большего количества информации.
Править: Улучшенный сценарий на основе комментариев Gilles.