Beim Starten von XTerm beginnt die Eingabeaufforderung in der ersten Zeile des Terminals. Beim Ausführen von Befehlen bewegt sich die Eingabeaufforderung nach unten, bis sie den Boden erreicht, und bleibt von da an dort (nicht einmal Shift- Page Downoder die Maus kann dies ändern). Anstatt dass der Beginn der Terminallebensdauer "speziell" ist, sollte sich die Eingabeaufforderung immer am unteren Rand des Terminals befinden. Bitte beachten Sie, dass ich eine mehrzeilige Eingabeaufforderung habe .
Natürlich sollte es ansonsten wie zuvor funktionieren (veränderbar, scrollbar, keine unnötigen Zeilenumbrüche in der Ausgabe und keine Ausgabe, die auf mysteriöse Weise verschwindet), daher PROMPT_COMMAND='echo;echo;...'
ist eine ähnliche Option nicht möglich. Die Lösung sollte idealerweise nicht schalenspezifisch sein.
Bearbeiten: Die aktuelle Lösung weist in einfachen Fällen einige Probleme auf:
- Es ist Bash-spezifisch . Eine ideale Lösung sollte auf andere Schalen tragbar sein.
- Es schlägt fehl, wenn andere Prozesse geändert werden
PS1
. Ein Beispiel dafür ist virtualenv, das fügt(virtualenv)
am Anfang derPS1
, die dann immer nur über die Klappe verschwindet. - Ctrl- Entferntl jetzt die letzte Seite des Verlaufs.
Gibt es eine Möglichkeit, diese Probleme zu vermeiden, ohne XTerm zu verzweigen?
clear
Befehls einfach wieder nach oben verschoben werden .Antworten:
Wenn Sie verwenden
bash
, sollte Folgendes den Trick tun:Oder (weniger effizient, da
tput
vor jeder Eingabeaufforderung ein Befehl ausgeführt wird, die Größe des Terminalfensters jedoch geändert wird):Um zu verhindern,
tput
dass der Exit-Code geändert wird, können Sie ihn explizit speichern und zurücksetzen:Beachten Sie, dass die Variable
retval
lokal ist. Es wirkt sich nicht auf eineretval
Variable aus, die Sie möglicherweise anders in der Shell definiert haben.Da die meisten Terminals
cup
gleich sind\e[y;xH
, können Sie sie auch fest codieren:Wenn Sie möchten, dass PS1 später nicht zurückgesetzt wird, können Sie auch die
PROMPT_COMMAND
Variable verwenden. Wenn festgelegt, wird es als Befehl ausgeführt, bevor die Eingabeaufforderung ausgegeben wird. So kann der Effekt auch durch erreicht werdenWährend das Zurücksetzen dies
PS1
nicht beeinflusst, kann sich natürlich auch eine andere Software ändernPROMPT_COMMAND
.quelle
tput
unterscheiden sich vieleecho
Befehle? (Aus Neugier fragen)'\[$(tput cup "$LINES")\]'
funktioniert wunderbar . Vielen Dank!tput
: Es scheint zurückgesetzt zu werden$exit_code
. Behoben durch Verwenden von\[\e[$LINES;1H\]
.tput
, die den Exit-Code beibehält .Als leichte Vereinfachung der vorherigen Antwort fiel es mir leichter, einfach zu laufen:
am Anfang von
.bashrc
oder.zshrc
. Es macht einfach den Job.Vorteile:
Nachteile:
clear
zuclear; tput ...
nicht hilft;quelle
Die Antworten mit
$LINES
sind unnötig nicht portierbar. Wie in ausgeführtresize
, können Sie einfach darum bittenxterm
, die Position auf eine beliebig große Zeilennummer einzustellen, z.(Angenommen, Sie haben ein Fenster mit weniger als 10.000 Zeilen, ohne Rückblick ).
Da sich die Zeichenfolge nicht als Nebeneffekt beim Ändern der Fenstergröße ändert, können Sie diese einmal berechnen und als Konstante in Ihre Eingabeaufforderungszeichenfolge einfügen, z.
und später
nach Ihren Wünschen.
Wie bei anderen Prozessen
PS1
, die geändert werden: Sie müssenPS1
nach diesen Änderungen neu berechnen , um sicherzustellen, dass es so aussieht, wie Sie es möchten. Die Frage enthält jedoch nicht genügend Details, um darauf hinzuweisen, wo die Änderungen vorgenommen werden müssen.Und schließlich: Das Verhalten bei der Tab-Vervollständigung passt aufgrund der Annahmen von bash nicht zu dieser Art von Änderung.
quelle
PS1="${TPUT_END} myprompt: "
, oder sogarPS1="${TPUT_END}${PS1}"