Как запустить XTerm с подсказки внизу?

Можно использовать сборку Eric Hameleer из http://www.slackware.com/~alien/slackbuilds/wine. Не могло бы быть актуальным (т.е. создать для 14,0, не мог бы быть там), но можно попытаться установить его так или иначе или просто восстановить его сами - на разумной машине, это должно быть готово в десятках мелкой вершины.

11
12.09.2014, 18:25
3 ответа

Если использовать bash, то должен быть выполнен следующий трюк:

TOLASTLINE=$(tput cup "$LINES")
PS1="\[$TOLASTLINE\]$PS1"

Или (менее эффективный, т.к. выполняется одна команда tput перед каждым запросом, но работает после изменения размера окна терминала):

PS1='\[$(tput cup "$LINES")\]'$PS1

Чтобы предотвратить изменение кода выхода tput, вы можете явно сохранить и сбросить его:

PS1='\[$(retval=$?;tput cup "$LINES";exit $retval)\]'$PS1

Обратите внимание, что переменная retval является локальной; она не влияет ни на одну переменную retval, которую вы могли бы определить в оболочке, в противном случае.

Так как большинство терминалов cup имеют одинаковую возможность \e[y;xH, вы также можете закодировать её:

PS1='\[\e[$LINES;1H\]'$PS1

Если вы хотите, чтобы она была безопасна от последующего сброса PS1, вы также можете использовать переменную PROMPT_COMMAND. Если она установлена, то выполняется как команда до , после чего выводится запрос. Так что эффект также может быть достигнут с помощью

PROMPT_COMMAND='(retval=$?;tput cup "$LINES";exit $retval)'

Конечно, в то время как сброс PS1 не повлияет на это, некоторые другие программы также могут изменить PROMPT_COMMAND.

11
27.01.2020, 19:58

В качестве небольшого упрощения предыдущего ответа мне показалось проще просто запустить:

tput cup $LINES

в начале .bashrc или .zshrc. Он просто делает свою работу.

Pros:

  • оно печатает только один раз, когда вы запускаете оболочку

Cons:

  • при очистке экрана с помощью ^L, оно не печатает и не накладывает псевдонимы clear на clear; tput ... не помогает;
  • побуждает к перемещению в другое место при изменении размера терминала
4
27.01.2020, 19:58

Ответы с использованием $LINES излишне не переносимы. Как сделано в resize, вы можете просто попросить xterm установить позицию на сколь угодно большое число строки, например,

tput cup 9999 0

(предполагая, что у вас есть окно меньше 10 тысяч строк, не считая scrollback).

Поскольку строка не будет изменяться как побочный эффект изменения размера окна, вы можете вычислить это один раз и вставить его в строку приглашения в качестве константы, например,

TPUT_END=$(tput cup 9999 0)

и позже

PS1="${TPUT_END} myprompt: "

в соответствии с вашими предпочтениями.

Что касается других процессов, модифицирующих PS1: вам придется перекомпилировать PS1 после этих изменений, чтобы убедиться, что он выглядит так, как вы хотите. Но в вопросе недостаточно деталей, чтобы указать , где внести изменения.

И, наконец: поведение для завершения табуляции не связано с такого рода изменениями из-за предположений bash.

2
27.01.2020, 19:58

Теги

Похожие вопросы