我希望能够使用键盘快捷键清除 Windows 终端中的回滚缓冲区。
在 WSL 中,我可以点击Ctrl+ L,它会执行换页(相当于clear -x
命令),它可以清除屏幕,但只能通过向上滚动内容并移出视图。
例如,我想做的是点击Ctrl+ K(如 macOS 终端),以便能够clear
在 WSL 和 PowerShell 中正确清除屏幕(类似于发出普通命令)。
这可能吗?
更新:现在 Windows 终端本机支持此功能。我在下面添加了我自己的答案并自我接受,但它有点被埋没了,所以这里有一个链接:https ://superuser.com/a/1628815/2924
2021-10-20 更新:现在从1.12 版开始原生支持(在撰写本文时处于预览状态)。
有关完整详细信息,请参阅PR #10906。
这些操作可以从命令面板调用,也可以通过设置 UI 绑定到键盘快捷键,并直接在
settings.json
官方文档中介绍。作为参考,这里讨论一下Cmd ⌘+K和Ctrl+之间的区别L:清除终端屏幕的 Ctrl+L 和 Cmd+K 有什么区别?
更长的答案
根据在 Windows 终端上工作的工程师 Mike Griese(GitHub 上的zadjii-msft )所说:
Dustin Howett( GitHub 上的 DHowett-MSFT)接着说:
参考:https ://github.com/microsoft/terminal/issues/1882
好吧,这变成了一条兔子路半;-) ...
我原以为这对于
sendInput
Windows Terminal 1.3 中引入的操作会非常简单,但我一直在使用这种方法。我并不声称自己是键绑定或终端转义序列方面的专家,但我正试图蒙混过关。首先,从 开始
man clear
,“清除回滚”序列是Esc[3J
。这可以通过以下方式在 Windows 终端中工作:Write-Output "`e[3J"
printf '\033[3J'
或等效的echo
)当然,它需要与“清除整个屏幕”序列(
\033[2J
)和“光标到起始位置”(\033[H
)(从这个答案中获得)相结合。把它放在一起,
printf '\033[2J\033[3J\033[H'
得到我们clear
(没有参数)的行为。所以我认为,鉴于Windows Terminal 1.3 发行说明
sendInput
中的示例,我们可以通过以下方式发送转义码:在该
"actions"
部分(以前"keybindings"
)。该\u001b[A
示例(向上箭头)对我来说很好,但是“清除回滚”会导致 bash 中出现错误提示并[3J
在 fish 中打印。\u001B[2J
仅尝试清除屏幕也会发生同样的情况。如果有人能弄清楚我在哪里出错了,我很想知道。但是......我们可以重新绑定shell中的键。但是,由于这个原因,他们可能无法分辨Ctrl+L和Ctrl++之间的区别。除了最近的 PSReadLine 2.0,它在键绑定上区分大小写。ShiftL
因此,如果你真的想在 WSL 的 PowerShell 和 Linux shell 中都使用++ Ctrl,则需要分两步完成:Shiftl
sendInput
首先,使用未使用的键码设置 Windows 终端操作:老实说,我不确定选择键码的最佳方法是什么。我刚刚使用了Hangul字符集 (
\uAC12
) 中的一些东西,因为我很确定我永远不会在现实生活中遇到它。请注意,此评论建议使用“私人使用”E000-EFFF
范围,但它在 Windows 终端上似乎相当多,而且我已经选择了韩文,所以我在下面的示例中使用\uAC12
.因此,我们需要
\uAC12
在每个 shell 中绑定以发送正确的转义序列:重击:
首先,获取要绑定到 with 的键序列
printf '\uAC12' | xxd
,结果为00000000: eab0 92
.然后,使用该输出,将绑定命令编码为
bind -x '"\xEA\xB0\x92":"printf \\033[2J\\033[3J\\033[H"'
(来自此答案xxd
中的评论的想法。)Zsh:它看起来有点复杂:
(在这个答案的帮助下)。
鱼:
bind \uAC12 "printf '\033[2J\033[3J\033[H'; commandline -f repaint"
电源:
Set-PSReadLineKeyHandler "$([char]0xAC12)" -ScriptBlock { Write-Output "`e[2J`e[3J"; [Microsoft.PowerShell.PSConsoleReadLine]::ClearScreen() }
。协助从这个答案[char]
中进行铸造,如果我没有花一点时间就可以找到在 ScriptBlock 中调用 PSReadline 函数的示例。PowerShell 核心:
Set-PSReadLineKeyHandler "$([char]0xAC12)" -ScriptBlock { Write-Host "`e[2J`e[3J"; [Microsoft.PowerShell.PSConsoleReadLine]::ClearScreen() }
. 不知道为什么 PowerShell 和 PowerShell Core 在这里表现不同。欢迎指正或改进建议。
编辑您的
~/.bashrc
cls
现在,您可以在 bash WSL 会话中键入以清除屏幕并回滚。编辑您的 Windows 终端 JSON 文件
现在按CTRL+k将为您输入 CLS 命令。对于 PowerShell 或 CMD 提示符,默认情况下已支持 CLS 命令,因此无需额外配置。