如何防止删除键像退格键一样

Kei*_*all 5 keyboard-shortcuts powershell

在 PowerShell 6.0.1 中,开箱即用的行为是,当我Delete在插入符号不在行尾时按下,它会按预期删除插入符号上方的字符。但是,一旦我删除了该行的最后一个字符,它就会将插入符号移回一个位置。我觉得这很烦人,因为我不能再坚持Delete删除直到行尾。有没有办法改变它,使它的行为与我按下时一样EndDelete- 即它什么都不做?

删除键

进行的研究:

在 backspace 上看到Disable PowerShell beep,并认为也许还有我想要的设置,但在阅读PSReadLine cmdlet 上的文档后,我发现没有。

然后我查看了键绑定,然后跑去Get-PSReadLineKeyHandler检查Delete当前分配给什么,然后代码库中搜索 DeleteCharPSReadLine,查看该函数的定义,并浏览类似的东西。我找到了DeleteCharOrExit,并运行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

Kei*_*all 5

事实证明,PowerShell Core 6.0.1 附带 PSReadLine 模块的 1.2 版,如 所示Get-Module PSReadLine,但修复程序位于https://github.com/lzybkr/PSReadLine/releases/tag/v2.0.0-beta1。看到那个版本说:

这是该存储库的第一个版本,支持 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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

(理想情况下,将其放置在适当的配置文件中,以便在 PowerShell 启动时自动运行。)

这也可以通过升级 PSReadLine 模块来解决,使用https://github.com/lzybkr/PSReadLine/issues/612 上的说明,它们是:

Install-Module PSReadLine -RequiredVersion 2.0.0-beta1 -AllowPrerelease -Scope CurrentUser -SkipPublisherCheck
Run Code Online (Sandbox Code Playgroud)

据推测,PowerShell Core 的未来版本将包含 PSReadLine 模块的固定版本。