
Immer wenn ich in meinem Terminal „clear“ ausführe, wird der Scrollback-Puffer vom oberen Bildschirmrand bis zur aktuellen Zeile gelöscht. Ich habe es in xterm, st und urxvt versucht, aber das Problem besteht weiterhin. Gibt es eine Möglichkeit, das Verhalten von „clear“ so zu ändern, dass der Scrollback-Puffer nicht berührt wird?
Antwort1
Der Kommentar "vom oberen Bildschirmrand bis zur aktuellen Zeile" ist mehrdeutig. Wenn Sie vom oberen Bildschirmrand bis zur aktuellen Zeile meinten,sichtbarer Teildes Bildschirms, das ist nicht diezurückblättern. Das Scrollback eines Terminals ist der Teil, den Sie nur mit der Bildlaufleiste (oder geeigneten Tasten wie Umschalt+Bild-auf) sehen können.
XTerm-Steuersequenzendokumentiert die relevante Escape-Sequenz:
CSI Ps J Erase in Display (ED).
Ps = 0 -> Erase Below (default).
Ps = 1 -> Erase Above.
Ps = 2 -> Erase All.
Ps = 3 -> Erase Saved Lines (xterm).
Die Terminalbeschreibungsfunktion clear
verwendet die vorletzte, z. B.
clear=\E[H\E[2J
, um den Cursor nach oben links zu positionieren und dann den gesamten (sichtbaren) Bildschirm zu löschen.könnteverwenden Sie dieUnten löschen, wird aber in der Terminalbeschreibung nicht verwendet.
Bezogen auf das Löschen derzurückblättern: Dies ist eine terminalspezifische Funktion, ursprünglich eine Escape-Sequenz in xterm (1999, dokumentiert inctlseqs.msaber nicht in Änderungen erwähnt) und später (2011) als Erweiterung für die Linux-Konsole und die entsprechende Terminalbeschreibung implementiert. Die Terminaldatenbank listet es als"sonstige Erweiterungen".
Derzeit verfügen diese Terminalbeschreibungen über die Funktion:
- linux3.0(der aktuelle Standard für „Linux“)
- Kitt
- xterm+grundlegend(ein Baustein, der in den meisten „xterm“-Varianten verwendet wird)
Ob es in xterm-Look-alikes wie VTE unterstützt wird, müsste durch Tests beantwortet werden (es gibt keine nützliche Dokumentation für VTE oder Konsole).
Wenn Sie die Erweiterung nicht verwenden möchten, können Sie dieE3
Fähigkeit aus der Terminalbeschreibung, die Sie verwenden, z. B.
infocmp -1x >foo
edit foo, removing the line with "E3="
tic -x foo
Ich habe vorgeschlagen, die Optionen zu verwenden-1
Und-x
um die Formatierung zu vereinfachen und die zu ändernde Funktion anzuzeigen. Das Beispiel inhttps://ghostbin.com/paste/kfsbjsteht im Einklang mit diesem Rat:
- der Pfadname
/home/flowerpick/.terminfo/x/xterm
würde von ncurses verwendet werden - Bei den Fähigkeiten
AX
undXT
handelt es sich um erweiterte Fähigkeiten (wieE3
), die mit der-x
Option angezeigt werden.
Wenn Sie mehr als einen Terminaltyp verwenden, müssen Sie dies für jeden tun (Wert von $TERM
), und die Änderung gilt nur für die Maschine, auf der Sie ausführen clear
. Die ersten Zeilen der infocmp
Ausgabe zeigen, an welchem Sie arbeiten:
# Reconstructed via infocmp from file: /home/flowerpick/.terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),
Beispielsweise wird auf etwas wie uxrvt
gesetzt , wodurch in Zeilen wie diese erzeugt werden :$TERM
rxvt-unicode
infocmp
# Reconstructed via infocmp from file: /lib/terminfo/r/rxvt-unicode
rxvt-unicode|rxvt-unicode terminal (X Window System),
Das st
Programm verwendet xterm
(oder möglicherweise xterm-256color
), obwohl es schon eine Weile her ist, seit ich eine Kopie von gesehen habeDasdas hat gut genug funktioniert, um einen Kommentar abzugeben.
Übrigens, dukönntehabe einen Alias, für clear
den die angegebene Escape-Sequenz gesendet wird (unter Ignorierung der Terminalbeschreibung), aber ich habe nicht gesehen, dass dies von irgendjemandem gemeldet wurde.
Wenn Sie "oben löschen" möchten, ist das nicht so einfach wie "clear" einzugeben. Die Escape-Taste \033[1J
löscht von oben links bis zur aktuellen Cursorposition. Sie könnten ein Skript erstellen, das dies tut, um nur dieLinienüber Ihrem aktuellen Cursor:
- Verwenden Sie den Cursorpositionsbericht, um die Zeile/Spalte zu finden, in der sich der Cursor gerade befindet, und
- Wenn der Cursor nicht in der ersten Zeile steht (Speichern dieser Position), bewegen Sie den Cursor eine Zeile nach oben und dann (mit der
hpa
Sequenz) bewegen SieRechtseine große Anzahl, - geben Sie das "Freizeichen oben" aus und
cup
Kehren Sie mit (Cursoradressierung) zur Ausgangsposition zurück .
Der Teil mit dem Cursorpositionsbericht scheint nicht in (zum Beispiel) einer Readline-Bindung zu funktionieren, daher habe ich ein Skript vorgeschlagen. Sie könnten eine Bindung erstellen, die die Funktionen zum Speichern/Wiederherstellen des Cursors verwendet, wenn das Problem nicht darin bestünde, in der ersten Zeile zu sein.
Antwort2
Ich hatte das gleiche Problem und das Hinzufügen eines Alias hat .bashrc
geholfen:
alias clear='printf "\E[H\E[2J"'
Erinnerung: Die Änderungen werden .bashrc
wirksam, nachdem Sie ein neues Terminal öffnen!
Antwort3
Ich verwende es regelmäßig, clear
damit meine Eingabeaufforderung an den oberen Bildschirmrand verschoben wird und dabei versehentlich den Scrollback-Puffer lösche, oft mit wichtigen Inhalten wie nützlichen Fehlermeldungen aus vorherigen Vorgängen.
Beim Überprüfen der Manpage wird eindeutig Folgendes angegeben:
„clear“ löscht Ihren Bildschirm, sofern möglich, einschließlich des Scrollback-Puffers (sofern die erweiterte Funktion „E3“ definiert ist).
Dort gibt es auch eine Option:
-x Versuchen Sie nicht, den Scrollback-Puffer des Terminals mit der erweiterten Funktion „E3“ zu löschen.
Seitdem habe ich dies zu meiner Liste der Aliase in ~/.bashrc hinzugefügt:
alias clear='clear -x'
Beim Ausführen werde ich immer noch aufgefordert, nach oben zu gehen clear
, aber jetzt kann ich bei Bedarf weiter nach oben zurückblättern.
Antwort4
Meine Lösung hierfür besteht darin, den folgenden Alias zu meinem hinzuzufügen.bashrc
alias clear='tput reset'
Falls Sie das ursprüngliche Verhalten verwenden möchten, z. B. um vertrauliche Informationen aus dem Scrollback-Puffer zu löschen, können Sie die Version ohne Alias ganz einfach aufrufen, indem Sie einen Backslash voranstellen, \
wie in diesem Artikel erläutert.HieroderHierDas würde dann so aussehen
\clear