Wenn ich den clear
Befehl verwende, wird der Bildschirm gelöscht. Vollständig. Ich habe überhaupt keinen Zugriff mehr auf die Dinge, die vorher auf dem Bildschirm waren.
Gibt es eine Möglichkeit, den Bildschirm zu „löschen“ (also die Eingabeaufforderung an den oberen Bildschirmrand zu bringen), ohne alles zu löschen, was auf dem Bildschirm war? Idealerweise würde ich den Bildschirm gerne „löschen“, aber nach oben scrollen können, um alles andere zu sehen.
Ich verwende das Windows-Terminalprogramm und die PowerShell-Shell, möchte aber auch die Antwort für die Windows-Befehlszeile wissen.
Ich habe angegeben, dass ich die Möglichkeit zum Hochscrollen beibehalten möchte. Damit meine ich, dass ich alles sehen möchten, was passiert ist, bevor ich den Befehl „Löschen“ gedrückt habe. Also … ja, ich möchte alles beibehalten, was vorher passiert ist, nicht den Befehlsverlauf.
Antwort1
PSReadline (der Standardeingabehandler von PowerShell) verfügt über einen CtrlLHotkey, der in den meisten Unix-Shells zu finden ist und der den Bildschirm löscht, als ob Sie den gesamten Text zum Herausscrollen gezwungen hätten (wie es das ASCII-Zeichen „Form Feed“ tun würde).
In PS5 löscht es jedoch immer noch dieangezeigtText vollständig – aber alles, was bereits zum Scrollback gegangen ist, bleibt im Scrollback.
Als Workaround können Sie genügend leere Zeilen ausgeben, um alles in den Scrollback zu schieben:
echo ("`n" * $Host.UI.RawUI.WindowSize.Height)
...und dann den Cursor nach oben bringen:
$e = [char]27
echo "$e[H" # Move cursor to 0;0
echo "$e[J" # Erase down/right
Dies könnte auch mit an eine Taste gebunden werden Set-PSReadlineKeyHandler -ScriptBlock
.
Cmd hat kein Äquivalent – es liest die Eingabe im Zeilenmodus, wobei Conhost stattdessen nur einige Tastenkombinationen bereitstellt. Sie können jedoch trotzdem ein Batch-Skript (oder sogar einen Conhost-DOSKEY-Alias) erstellen, das dieselben VT-Sequenzen ausgibt.
Antwort2
Während das Löschen des Bildschirms eineTerminalFunktion (über ANSI-Terminalsteuercodes), die Art und Weise, wie Sie diese Codes erhalten, kann je nach Shell unterschiedlich sein. Die allgemeine Idee ist folgende:
ESC[2J
löscht den Bildschirm, lässt aber den ScrollbackESC[3J
löscht den Bildschirm, einschließlich aller Scrollback-
... wobei ESC
der ASCII-Zeichencode 27 darstellt.
Laut man clear
Linux 2J
war der Code ursprünglich (1999) eine Erweiterung von XTerm, die 2011 vom Linux-Kernel für den Konsolentreiber übernommen wurde. Einige Zeit später wurde er von Windows Console Host übernommen und war wahrscheinlich seit seiner Einführung in Windows Terminal enthalten.
Windows-Terminal (für alle Shells)
Windows Terminal beinhaltet dieclearBuffer
Aktiondie an jeden Hotkey gebunden werden kann. Es wirkt sich jedoch auf alle Shells ausunabhängig davon, welche Anwendung darin ausgeführt wirdvi
. Aus diesem Grund rate ich von der Verwendung ab, es sei denn, Sie sind sicher, dass Sie den Hotkey in einer Situation wie dieser (oder Schlimmerem) nicht versehentlich drücken .
Allerdings ist dies definitiv der einfachste Weg, diese Funktionalität in CMD zu erhalten.
Wenn Sie es verwenden möchten, können Sie mit der Aktion ein Ziel clearBuffer
angeben :clear
screen
scrollback
all
Durch die Verwendung dieser screen
Option wird der aktuelle Bildschirminhalt gelöscht, der Scrollback bleibt jedoch bestehen.
Sie müssen Ihr Windows-Terminal settings.json
direkt bearbeiten, da es in der Benutzeroberfläche keine Möglichkeit gibt, das clear
Ziel festzulegen:
{
"command":
{
"action": "clearBuffer",
"clear": "screen"
},
"keys": ""
}
Power Shell
FürPower Shell, alsuser1684 war schneller Ctrl+ Lsendet die richtige Escape-Sequenz.
Andererseits sendet Clear-Host
(Alias clear
) in PowerShell ein ESC[3J
(und löscht auch den Scrollback).
Wenn Sie über das Muskelgedächtnis zum Tippen clear
in PowerShell verfügen, können Sie einfach die Definition ändern:
Remove-Item Alias:clear
function clear {
Write-Output "$([char]27)[2J"
}
Platzieren Sie dies in Ihrem PowerShell-Profil, wenn Sie es dauerhaft wünschen.
CMD
Dies ist zwar auch in CMD möglich, aber schwierig.
Das größte Problem in CMD ist eigentlich, das ESC-Zeichen (ASCII 27) auszudrucken. Ich hatte das eigentliche „Zeichen“ hier eingefügt, das per Kopieren/Einfügen in CMD übertragen werden würde, aber es wurde gelöscht, als ich das erste Mal eine weitere Bearbeitung an diesem Beitrag vornahm. Das Zeichen ist im (Quell-)Bearbeitungsverlauf für diese Antwort noch vorhanden, aber lassen Sie uns einen besseren Weg finden, dies zu tun.
AusPower Shell, verwenden Sie dies, um einCMDBatchdatei:
@"
@echo off
echo $([char]27)[2J
"@ | Out-File -FilePath .\clear.cmd -Encoding ASCII
Das Ausführen der resultierenden clear.cmd
Batchdatei in CMD sollte den Bildschirm löschen (aber nicht das Scrollback).
Wenn Sie damit Probleme haben, sollte es mit jeder Methode funktionieren, mit der Sie ASCII 27 gefolgt von drucken können [2J
. Wenn Sie PowerShell Core installiert haben, zum Beispiel:
pwsh -c "Write-Output "`e[2J""
Und um noch ein paar zusätzliche Einzelheiten zu einem Ihrer Kommentare anzugeben:
Das scheint entweder der größte Konstruktionsfehler der Welt zu sein oder ... ich weiß nicht. Ich behaupte, dass es wahrscheinlich zumindest eine Lösung gibt.
Also ja, wir haben eine Problemumgehung gefunden, aber es würde mich ehrlich gesagt nicht überraschen, wenn das nicht der Fall wäre. Denken Sie daran, dass der Windows Console Host (in dem CMD standardmäßig ausgeführt wurde) auf Windows 95 (also 27 Jahre) zurückgeht, also lange bevor XTerm diese Codes überhaupt hinzugefügt hat.
Und obwohl das Windows-Terminal viel moderner ist, glaube ich nicht, dass CMD (das die Codes generieren muss) seit der Veröffentlichung von PowerShell im Jahr 2006 wesentliche Updates erfahren hat.
Ich schätze uns wirklich glücklich, dass wir eine Problemumgehung haben ;-).
Windows-Subsystem für Linux
- Ctrl+ Lfunktioniert auch von vielen Linux-Shells aus, um ein
ESC[2J
(Leave Scrollback) zu senden. clear
verhält sich wie bei PowerShell und löscht den BildschirmUndzurückblättern (ESC[3J
).clear -x
verlässt das Scrollback (ESC[2J
)
Antwort3
Als Workaround können Sie in CMD gedrückt halten, Ctrl↓ (Down arrow)bis der Bildschirm leer ist. Der Scrollvorgang wird ziemlich schnell nach unten durchgeführt, sodass es möglich ist, zu weit zu scrollen. In diesem Fall können Sie drücken Ctrl→ (Right arrow)oder mit der Eingabe beginnen, und die Eingabeaufforderungszeile wird wieder angezeigt. Alles, was den Cursor bewegt, funktioniert.
Dies scheint in Powershell leider nicht zu funktionieren.
Antwort4
PowerShell löschen und Scrollback beibehalten
Power Shell
Früher habe ich Get-Command
nach Cmdlets wie Write-Host
oder gesucht Write-Output
, weil es WIRKLICH seltsam erscheint, dass dies keine Funktion von Powershell ist.
Get-Command -CommandType Cmdlet
Es gibt keinen