使用该clear
命令时,屏幕会完全清除。我再也无法访问屏幕上之前显示的任何内容。
有没有办法“清除”屏幕(即让提示符移到屏幕顶部)而不删除屏幕上的所有内容?理想情况下,我希望“清除”屏幕,但能够向上滚动以查看其他所有内容。
我正在使用 Windows 终端程序和 PowerShell shell,但我也想知道 Windows 命令行的答案。
我说我想保持向上滚动的能力——我的意思是我想能够看到在我点击“清除”命令之前的所有内容,所以......是的,我想保留之前的所有内容,而不是命令历史记录。
答案1
PSReadline(PowerShell 的标准输入处理程序)具有CtrlL大多数 Unix shell 中的热键,它会清除屏幕,就像您强制所有文本滚动出去一样(就像 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 只提供了几个快捷方式。但是,您仍然可以创建一个批处理脚本(甚至是 Conhost DOSKEY 别名),它将输出相同的 VT 序列。
答案2
清除屏幕是终端函数(通过 ANSI 终端控制代码),发送这些代码的方式可能因 shell 而异。一般思路是:
ESC[2J
清除屏幕,但留下回滚ESC[3J
清除屏幕,包括所有回滚
...其中ESC
代表 ASCII 字符代码 27。
根据man clear
Linux 的说法,该2J
代码最初(1999 年)是 XTerm 的一个扩展,2011 年被 Linux 内核采纳用于控制台驱动程序。一段时间后,Windows Console Host 采纳了它,它可能自 Windows Terminal 诞生之日起就一直存在。
Windows 终端(适用于所有 shell)
Windows 终端包括clearBuffer
行动可以绑定到任何热键。但是,它会影响所有 shell无论其中运行的是什么应用程序。因此,我不建议使用它,除非您确定在类似vi
(或更糟糕的)情况下不会意外按下热键。
也就是说,这绝对是在 CMD 中获取此功能的最简单方法。
如果您确实想使用它,该clearBuffer
操作允许您指定clear
以下目标:
screen
scrollback
all
使用该screen
选项将清除屏幕的当前内容但保留回滚。
您需要settings.json
直接编辑 Windows 终端,因为 UI 没有办法设置clear
目标:
{
"command":
{
"action": "clearBuffer",
"clear": "screen"
},
"keys": ""
}
电源外壳
为了电源外壳, 作为用户1684 抢先了 Ctrl+L发送正确的转义序列。
另一方面, PowerShell 上的Clear-Host
(别名clear
) 发送ESC[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 默认在其中运行)可以追溯到 Windows 95(现在已经 27 年了),远在 XTerm 添加这些代码之前。
尽管 Windows Terminal 更加现代化,但我认为自 2006 年 PowerShell 发布以来,CMD(需要生成代码)没有进行过任何实质性的更新。
真的,我很幸运我们找到了解决方法;-)
适用于 Linux 的 Windows 子系统
- Ctrl+L还可以从许多 Linux shell 发送
ESC[2J
(leave scrollback)。 clear
就像在 PowerShell 中一样,清除屏幕和回滚(ESC[3J
)。clear -x
将离开回滚(ESC[2J
)
答案3
解决方法是,在 CMD 中,您可以按住Ctrl↓ (Down arrow)直到屏幕空白。它会相当快地向下滚动,因此可能会滚动太多。在这种情况下,您可以按下Ctrl→ (Right arrow)或开始输入,提示行会重新弹出到视图中。任何移动光标的操作都可以。
不幸的是,这在 Powershell 中似乎不起作用。
答案4
清除 PowerShell 并保留回滚
电源外壳
我曾经Get-Command
寻找过像Write-Host
或者这样的 cmdlet Write-Output
,因为这不是 powershell 的功能,这看起来真的很奇怪。
Get-Command -CommandType Cmdlet
没有