При запуске XTerm приглашение запускается в первой строке терминала. При запуске команд подсказка перемещается вниз до тех пор, пока не достигнет дна, и с тех пор она остается там (даже не Shift- Page Downили мышь может изменить это). Вместо того, чтобы начало срока службы терминала было «специальным», подсказка всегда должна быть в нижней части терминала. Обратите внимание, что у меня есть многострочная подсказка .
Конечно, в противном случае он должен работать как прежде (изменяемый размер, прокручиваемый, без лишних переводов строки в выходных данных и без таинственного исчезновения выходных данных), поэтому PROMPT_COMMAND='echo;echo;...'
аналогичный вариант не подходит. Решение в идеале не должно быть специфичным для оболочки.
Edit: текущее решение , при работе в простых случаях, есть несколько вопросов:
- Это специфично для Bash . Идеальное решение должно быть переносимым на другие оболочки.
- Это не выполняется , если другие процессы изменения
PS1
. Одним из примеров является virtualenv, который добавляет(virtualenv)
в начале изPS1
, который затем всегда исчезает чуть выше складки. - Ctrl- lтеперь удаляет последнюю страницу истории.
Есть ли способ избежать этих проблем, кроме разветвления XTerm?
clear
команду.Ответы:
При использовании
bash
, следующее должно сделать трюк:Или (менее эффективно, поскольку он запускает одну
tput
команду перед каждым приглашением, но работает после изменения размера окна терминала):Чтобы предотвратить
tput
изменение кода выхода, вы можете явно сохранить и сбросить его:Обратите внимание, что переменная
retval
является локальной; это не влияет наretval
переменную, которую вы могли бы определить в оболочке.Поскольку
cup
возможности большинства терминалов одинаковы\e[y;xH
, вы также можете жестко закодировать их:Если вы хотите, чтобы это было безопасно от последующего сброса PS1, вы также можете использовать
PROMPT_COMMAND
переменную. Если установлен, он запускается как команда перед выводом приглашения. Таким образом, эффект также может быть достигнутКонечно, хотя сброс
PS1
не повлияет на это, некоторые другие программы также могут изменитьсяPROMPT_COMMAND
.источник
tput
отличаются многиеecho
команды? (Спрашивая из любопытства)'\[$(tput cup "$LINES")\]'
работает прекрасно . Благодарность!tput
: Кажется, для сброса$exit_code
. Исправлено с помощью\[\e[$LINES;1H\]
.tput
которой сохраняется код завершения.В качестве небольшого упрощения к предыдущему ответу, мне было проще просто запустить:
в начале
.bashrc
или.zshrc
. Это просто делает работу.Плюсы:
Минусы:
clear
наclear; tput ...
не помогает;источник
Использование ответов
$LINES
излишне непереносимо. Как и в случаеresize
, вы можете просто попроситьxterm
установить позицию на произвольно большой номер строки, например,(при условии, что у вас есть окно меньше 10 тысяч строк, без учета прокрутки ).
Поскольку строка не изменится как побочный эффект изменения размера окна, вы можете вычислить это один раз и вставить в строку подсказки как константу, например:
и позже
в соответствии с вашими предпочтениями.
Что касается других процессов, изменяющих
PS1
: вам придется пересчитатьPS1
после этих изменений, чтобы убедиться, что он выглядит так, как вы хотите. Но в вопросе недостаточно подробностей, чтобы указать, где внести изменения.И наконец: поведение для завершения табуляции не согласуется с такого рода изменениями из-за предположений bash.
источник
PS1="${TPUT_END} myprompt: "
, или дажеPS1="${TPUT_END}${PS1}"