Bob*_*Bob 13 powershell command-line windows-10 windows-terminal
使用该clear
命令时,屏幕会清除。完全。我根本无法再访问以前屏幕上的任何内容。
有没有办法“清除”屏幕(即使提示转到屏幕顶部)而不擦除屏幕上的所有内容?理想情况下,我想“清除”屏幕,但能够向上滚动以查看其他所有内容。
我正在使用 Windows 终端程序和 PowerShell shell,但我也想知道 Windows 命令行的答案。
我说我想保持向上滚动的能力 - 我的意思是我希望能够看到在我点击“清除”命令之前出现的所有内容,所以......是的,我想保留出现的所有内容之前,不是命令历史记录。
use*_*686 15
PSReadline(PowerShell 的标准输入处理程序)具有CtrlL大多数 Unix shell 中的热键,它会清除屏幕,就像强制滚动所有文本一样(就像 ASCII“换页”字符一样)。
\n在 PS5 中,虽然它仍然完全删除显示的文本 \xe2\x80\x93 但已经进入回滚的所有内容都将保留在回滚中。
\n作为解决方法,您可以输出足够的空行以将所有内容推入回滚:
\necho ("`n" * $Host.UI.RawUI.WindowSize.Height)\n
Run Code Online (Sandbox Code Playgroud)\n...然后将光标移至顶部:
\n$e = [char]27\necho "$e[H" # Move cursor to 0;0\necho "$e[J" # Erase down/right\n
Run Code Online (Sandbox Code Playgroud)\n这也可以使用 绑定到一个键Set-PSReadlineKeyHandler -ScriptBlock
。
Cmd 没有等效的 \xe2\x80\x93 它以行模式读取输入,只有 Conhost 提供的一些快捷方式。但是,您仍然可以创建一个批处理脚本(甚至是 Conhost DOSKEY 别名)来输出相同的 VT 序列。
\n虽然清除屏幕是一个终端功能(通过 ANSI 终端控制代码),但发送这些代码的方式可能会因 shell 的不同而有所不同。总体思路是:
ESC[2J
清除屏幕,但保留回滚ESC[3J
清除屏幕,包括所有回滚... 其中ESC
表示 ASCII 字符代码 27。
根据man clear
on Linux 的说法,该2J
代码最初(1999 年)是 XTerm 的扩展,2011 年 Linux 内核将其用于控制台驱动程序。一段时间后,Windows 控制台主机拾取了它,并且它可能从一开始就位于 Windows 终端中。
Windows 终端包括可以绑定到任何热键的clearBuffer
操作。但是,它会影响所有 shell,无论其中运行什么应用程序。因此,我建议不要使用它,除非您确定在类似vi
(或更糟)的情况下不会意外按下热键。
也就是说,这绝对是在 CMD 中获得此功能的最简单方法。
如果您确实想使用它,该clearBuffer
操作允许您指定clear
以下目标:
screen
scrollback
all
使用该screen
选项将清除屏幕的当前内容,但保留回滚。
您需要settings.json
直接编辑 Windows 终端,因为 UI 无法设置目标clear
:
{
"command":
{
"action": "clearBuffer",
"clear": "screen"
},
"keys": ""
}
Run Code Online (Sandbox Code Playgroud)
对于PowerShell,因为user1684 抢先了我 Ctrl+L发送了正确的转义序列。
另一方面,PowerShell 上的Clear-Host
(alias ) 发送一个(也清除回滚)。clear
ESC[3J
如果您对在 PowerShell 中输入有肌肉记忆clear
,则可以简单地更改其定义:
Remove-Item Alias:clear
function clear {
Write-Output "$([char]27)[2J"
}
Run Code Online (Sandbox Code Playgroud)
如果您希望它永久存在,请将其放入您的 PowerShell 配置文件中。
这是可能的,但在 CMD 中也很棘手。
CMD 中最大的问题实际上是打印 ESC 字符(ASCII 27)。我在这里粘贴了实际的“字符”,它将通过复制/粘贴传输到 CMD,但在我第一次对这篇文章进行另一次编辑时它被删除了。该角色仍然存在于该答案的(源)编辑历史记录中,但让我们找到一种更好的方法来做到这一点。
在PowerShell中,使用它创建CMD批处理文件:
@"
@echo off
echo $([char]27)[2J
"@ | Out-File -FilePath .\clear.cmd -Encoding ASCII
Run Code Online (Sandbox Code Playgroud)
在 CMD 中执行生成的clear.cmd
批处理文件应该会清除屏幕(但不会回滚)。
如果您遇到问题,任何可以打印 ASCII 27 和后跟的方法都[2J
可以。如果您安装了 PowerShell Core,例如:
pwsh -c "Write-Output "`e[2J""
Run Code Online (Sandbox Code Playgroud)
只是为了提供有关您的评论之一的一些额外详细信息:
这看起来要么是世界上最大的设计失败,要么……我不知道。我认为至少可能有一个解决方法。
所以,是的,我们已经想出了一个解决方法,但老实说,如果我们没有这样做,我也不会感到惊讶。请记住,Windows 控制台主机(CMD 过去默认在其中运行)可以追溯到 Windows 95(距今 27 年),远早于 XTerm 添加这些代码。
虽然 Windows 终端更加现代,但我认为自 2006 年 PowerShell 发布以来 CMD(需要生成代码)没有任何实质性更新。
真的,我认为我们很幸运,我们有一个解决方法;-)。
ESC[2J
(保留回滚)。clear
将像在 PowerShell 上一样,清除屏幕并回滚 ( ESC[3J
)。clear -x
将保留回滚 ( ESC[2J
) 归档时间: |
|
查看次数: |
9788 次 |
最近记录: |