PowerShell をクリアしてスクロールバックを保持する

PowerShell をクリアしてスクロールバックを保持する

コマンドを使用するとclear、画面がクリアされます。完全に。以前画面に表示されていたものには、まったくアクセスできなくなりました。

画面に表示されていたものをすべて消去せずに、画面を「クリア」する方法 (つまり、プロンプトを画面上部に表示する) はありますか? 理想的には、画面を「クリア」しながらも、上にスクロールして他のすべてを表示できるようにしたいです。

Windows ターミナル プログラムと PowerShell シェルを使用していますが、Windows コマンド ラインの回答も知りたいです。

上方向にスクロールする機能を維持したいと書きました。つまり、「クリア」コマンドを実行する前に実行したすべての操作を確認できるようにしたいということです。つまり、コマンド履歴ではなく、実行したすべての操作を維持したいのです。

答え1

PSReadline (PowerShell の標準入力ハンドラー) には、CtrlLほとんどの Unix シェルに見られるホットキーがあり、すべてのテキストを強制的にスクロールアウトしたかのように画面をクリアします (ASCII の「フォーム フィード」文字のように)。

PS5では、それでも表示されたテキストは完全に表示されますが、すでにスクロールバックされているものはすべてスクロールバックに残ります。

回避策として、すべてをスクロールバックに押し出すのに十分な空行を出力することができます。

echo ("`n" * $Host.UI.RawUI.WindowSize.Height)

...そしてカーソルを一番上に移動します:

$e = [char]27
echo "$e[H" # Move cursor to 0;0
echo "$e[J" # Erase down/right

これは を使用してキーにバインドすることもできますSet-PSReadlineKeyHandler -ScriptBlock

Cmd には同等のものはありません。入力をラインモードで読み取り、代わりに Conhost によって提供されるショートカットがいくつかあります。ただし、同じ VT シーケンスを出力するバッチ スクリプト (または Conhost DOSKEY エイリアス) を作成することはできます。

答え2

画面をクリアしている間はターミナル関数(ANSI 端末制御コード経由)の場合、それらのコードを送信する方法はシェルによって異なります。一般的な考え方は次のとおりです。

  • ESC[2J画面をクリアしますが、スクロールバックは残ります
  • ESC[3Jすべてのスクロールバックを含む画面をクリアします

...はESCASCII文字コード27を表します。

man clearLinux によると、この2Jコードは元々 (1999 年) XTerm の拡張機能であり、2011 年に Linux カーネルによってコンソール ドライバー用に採用されました。その後しばらくして、Windows Console Host がこれを採用し、おそらく Windows Terminal の当初から使用されていました。

Windows ターミナル (すべてのシェル用)

Windowsターミナルには、clearBufferアクションこれは任意のホットキーにバインドできます。ただし、すべてのシェルに影響します内部でどのようなアプリケーションが実行されているかに関係なくそのため、次のような状況vi(またはそれ以上の状況) で誤ってホットキーを押してしまうことがない場合は、使用しないことをお勧めします。

そうは言っても、CMD でこの機能を利用する最も簡単な方法であることは間違いありません。

これを使用したい場合は、clearBufferアクションで次のターゲットを指定できますclear

  • screen
  • scrollback
  • all

このscreenオプションを使用すると、画面の現在の内容はクリアされますが、スクロールバックはそのまま残ります。

settings.jsonUI にはターゲットを設定する方法がないため、Windows ターミナルを直接編集する必要がありますclear

        {
            "command": 
            {
                "action": "clearBuffer",
                "clear": "screen"
            },
            "keys": ""
        }
パワーシェル

のためにパワーシェル、 としてuser1684 が私に先んじた Ctrl+ はL適切なエスケープ シーケンスを送信します。

一方、PowerShell のClear-Host(alias ) は(スクロールバックもクリアする) を送信します。clearESC[3J

PowerShell での入力を筋肉で覚えている場合はclear、定義を変更するだけで済みます。

Remove-Item Alias:clear
function clear {
    Write-Output "$([char]27)[2J"
}

これを永続的にしたい場合は、PowerShell プロファイルに配置します。

CMDF

可能ですが、CMD でもこれを行うのは難しいです。

CMD の最大の問題は、実際に ESC 文字 (ASCII 27) を印刷することです。ここに貼り付けた実際の「文字」は、コピー/貼り付けによって CMD に転送されますが、この投稿をもう一度編集したときに初めて消去されました。この回答の (ソース) 編集履歴にはまだ文字が残っていますが、もっと良い方法を見つけましょう。

からパワーシェル、これを使用して作成しますCMDFバッチファイル:

@"
@echo off
echo $([char]27)[2J
"@ | Out-File -FilePath .\clear.cmd -Encoding ASCII

結果のclear.cmdバッチ ファイルを CMD で実行すると、画面がクリアされます (ただし、スクロールバックはクリアされません)。

これに問題がある場合は、ASCII 27 を印刷する方法であれば何でも[2J機能するはずです。たとえば、PowerShell Core がインストールされている場合は、次のようになります。

pwsh -c "Write-Output "`e[2J""

あなたのコメントの 1 つについて、さらに詳しい情報を提供します。

これは世界最大の設計ミスのように思えますが... わかりません。少なくとも回避策はあると思います。

はい、私たちは回避策を思いつきました。しかし、思いつかなかったとしても驚きません。Windows コンソール ホスト (CMD がデフォルトで実行されていた場所) の歴史は Windows 95 (つまり今から 27 年前) まで遡り、XTerm がそれらのコードを追加するずっと前のことでした。

Windows Terminal ははるかに最新ですが、コードを生成する必要がある CMD は、2006 年に PowerShell がリリースされる以前から大幅な更新は行われていないと思います。

本当に、回避策が見つかったのは幸運だと思います ;-)。

Linux 用 Windows サブシステム
  • Ctrl+L多くの Linux シェルからESC[2J(スクロールバックを残す) を送信するためにも機能します。
  • clearPowerShellのように動作し、画面をクリアしますそしてスクロールバック(ESC[3J)。
  • clear -xスクロールバック(ESC[2J)を残します

答え3

回避策として、CMD では画面が空になるまで押し続けますCtrl↓ (Down arrow)。かなり速くスクロールするので、スクロールしすぎる可能性があります。その場合は、 を押すCtrl→ (Right arrow)か入力を開始すると、プロンプト ラインが再び表示されます。カーソルを移動できるものであれば何でもかまいません。

残念ながら、これは Powershell では機能しないようです。

答え4

PowerShell をクリアしてスクロールバックを保持する

パワーシェル

以前は、 やGet-Commandのようなコマンドレットを探していました。PowerShell にこれが機能していないのは本当に奇妙に思えたからです。Write-HostWrite-Output

Get-Command -CommandType Cmdlet

一つもない

関連情報