在 PowerShell 6.0.1 中,开箱即用的行为是,当我按下插入Delete符号不在行尾时,它会按预期删除插入符号上方的字符。但是,一旦我删除行上的最后一个字符,它就会将插入符号移回一个位置。我觉得这很烦人,因为我不能再按住Delete删除键直到行尾。有没有办法改变它,使它的行为与我按下时相同EndDelete- 即它什么也不做?
开展的研究:
我看见禁用退格键上的 PowerShell 蜂鸣声,我想也许也有我想要的设置,但读完之后PSReadLine cmdlet 上的文档,我一看,没有。
然后我查看了按键绑定,并Get-PSReadLineKeyHandler
检查了Delete当前分配给了什么,然后DeleteChar
在PSReadLine
代码库中搜索 ,查看该函数的定义,并浏览类似内容。我发现删除字符或退出,并且运行时Set-PSReadLineKeyHandler -Key Delete -Function DeleteCharOrExit
不会退出“删除”过程 - 正如我从不清楚的文档注释中所假设的那样 - 它退出 PowerShell 控制台过程......
我还发现https://github.com/lzybkr/PSReadLine/issues/486,这表明它已被修复,但显然不是......
也许我需要注入一些自定义键绑定代码,例如https://github.com/lzybkr/PSReadLine/blob/46d232c22ac3f24a95e32d773c594ad306dfc327/PSReadLine/SamplePSReadLineProfile.ps1#L257-L291?
答案1
事实证明,PowerShell Core 6.0.1 附带了 PSReadLine 模块 1.2 版本Get-Module PSReadLine
,但修复是在https://github.com/lzybkr/PSReadLine/releases/tag/v2.0.0-beta1. 鉴于该新闻稿称:
这是 repo 中第一个支持 PowerShell Core(所有平台)和 Windows PowerShell 的版本。
我以为我有那个版本并且最初没有检查。
为了使其与该版本一起工作,可以使用:
Set-PSReadLineKeyHandler -Key Delete `
-BriefDescription Delete `
-LongDescription "Delete character over the caret" `
-ScriptBlock {
param($key, $arg)
$line = $null
$cursor = $null
[Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)
if ($cursor -lt $line.Length)
{
[Microsoft.PowerShell.PSConsoleReadLine]::Delete($cursor, 1)
}
}
(最好将其放在适当的配置文件中,以便它在 PowerShell 启动时自动运行。)
也可以通过升级 PSReadLine 模块来解决这个问题,具体说明如下:https://github.com/lzybkr/PSReadLine/issues/612, 哪个是:
Install-Module PSReadLine -RequiredVersion 2.0.0-beta1 -AllowPrerelease -Scope CurrentUser -SkipPublisherCheck
据推测,PowerShell Core 的未来版本将包含 PSReadLine 模块的修复版本。