Відобразити інформацію під підказкою у запиті оболонки?


21

Скажімо, моє підказка виглядає так (_ представляє мій курсор)

~ % _

Чи є спосіб, щоб я міг зробити так, як це було

~ % _
[some status]

Питання спочатку стосувалося zsh, але тепер має інші відповіді.


Як щодо екрана + buobu ?: launchpad.net/byobu , а може бути, kmandla.wordpress.com/2010/01/03/… для скріншотів
Janus

Відповіді:


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-рішення 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 спосіб емулювати ЗШ в preexecфункції. Дивіться /superuser/175799/ для отримання додаткової інформації.

EDIT : Покращений сценарій на основі коментарів Жилла.


@Gilles: Дякую за вклад! Я думаю, що зараз я працюю краще. Спробував bash 4.1.5 в gnome-termin і xterm, і bash 3.2.48 в OSX-терміналі.
Джандер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.