PowerShell을 지우고 스크롤백을 유지합니다.

PowerShell을 지우고 스크롤백을 유지합니다.

명령 을 사용하면 clear화면이 지워집니다. 완전히. 이전에 화면에 있던 내용에 더 이상 액세스할 수 없습니다.

화면에 있던 모든 내용을 지우지 않고 화면을 "지우기"(즉, 프롬프트가 화면 상단으로 이동하게 만드는) 방법이 있나요? 이상적으로는 화면을 "지우고" 싶지만 위로 스크롤하여 다른 모든 항목을 볼 수 있습니다.

Windows 터미널 프로그램과 PowerShell 셸을 사용하고 있는데 Windows 명령줄에 대한 답변도 알고 싶습니다.

나는 위로 스크롤하는 기능을 유지하고 싶다고 말했습니다. 이는 "clear" 명령을 누르기 전에 제공된 모든 것을 볼 수 있기를 원한다는 것을 의미합니다. 따라서... 예, 제공된 모든 것을 유지하고 싶습니다. 이전에는 명령 기록이 아닙니다.

답변1

PSReadline(PowerShell의 표준 입력 처리기) CtrlL에는 대부분의 Unix 셸에 있는 단축키가 있습니다. 이 단축키는 모든 텍스트를 강제로 스크롤하는 것처럼(ASCII "Form Feed" 문자처럼) 화면을 지웁니다.

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 콘솔 호스트가 이를 선택했으며 아마도 처음부터 Windows 터미널에 있었을 것입니다.

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(별칭 )은 (스크롤백도 지우기)을 보냅니다.clearESC[3J

PowerShell에 입력할 수 있는 머슬 메모리가 있는 경우 clear해당 정의를 간단히 변경할 수 있습니다.

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

영구적으로 사용하려면 이를 PowerShell 프로필에 배치하세요.

명령

가능하지만 CMD에서도 이 작업을 수행하는 것은 까다롭습니다.

CMD의 가장 큰 문제는 실제로 ESC 문자(ASCII 27)를 인쇄하는 것입니다. 복사/붙여넣기를 통해 CMD로 전송할 실제 "문자"를 여기에 붙여넣었지만 이 게시물을 처음 편집했을 때 지워졌습니다. 해당 캐릭터는 이 답변에 대한 (소스) 편집 기록에 여전히 남아 있지만 이를 수행하는 더 좋은 방법을 찾아보겠습니다.

에서파워셸, 이를 사용하여명령배치 파일:

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

CMD에서 결과 clear.cmd배치 파일을 실행하면 화면이 지워집니다(스크롤백은 지워지지 않음).

문제가 있는 경우 ASCII 27을 인쇄하고 이어서 인쇄하면 [2J작동합니다. 예를 들어 PowerShell Core가 설치되어 있는 경우:

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

귀하의 의견 중 하나에 대한 추가 세부 정보를 제공하려면 다음을 수행하십시오.

그건 세계 최대의 설계 실패인 것 같군요. 아니면... 모르겠어요. 나는 최소한 해결 방법이 있을 것이라고 주장합니다.

그렇습니다. 우리는 해결 방법을 찾았습니다. 하지만 그렇지 않았더라도 솔직히 놀랄 일이 아니었습니다. Windows 콘솔 호스트(CMD가 기본적으로 실행되었던)는 XTerm이 해당 코드를 추가하기 훨씬 전인 Windows 95(현재 27년)로 거슬러 올라갑니다.

Windows 터미널은 훨씬 더 현대적이지만 코드를 생성해야 하는 CMD는 2006년 PowerShell이 ​​출시되기 이전 이후로 실질적인 업데이트가 이루어지지 않았다고 생각합니다.

실제로 해결 방법이 있어서 다행이라고 생각합니다 ;-).

Linux용 Windows 하위 시스템
  • Ctrl+는 L또한 많은 Linux 쉘에서 작동하여 ESC[2J(스크롤백 남기기)를 보냅니다.
  • clearPowerShell처럼 작동하여 화면을 지웁니다.그리고스크롤백( ESC[3J).
  • clear -x스크롤백을 종료합니다( ESC[2J).

답변3

Ctrl↓ (Down arrow)해결 방법으로 CMD에서 화면이 빌 때까지 길게 누를 수 있습니다 . 상당히 빠르게 아래로 스크롤되므로 너무 많이 스크롤할 수 있습니다. 이 경우 키를 누르 Ctrl→ (Right arrow)거나 입력을 시작하면 프롬프트 줄이 다시 표시됩니다. 커서를 움직이는 것은 무엇이든 가능합니다.

불행히도 Powershell에서는 작동하지 않는 것 같습니다.

답변4

PowerShell을 지우고 스크롤백을 유지합니다.

파워셸

나는 이것이 powershell의 기능이 아니라는 것이 정말 이상해 보이기 때문에 또는 Get-Command같은 cmdlet을 찾곤 했습니다 .Write-HostWrite-Output

Get-Command -CommandType Cmdlet

하나도 없어

관련 정보