在 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 附帶了 1.2 版的 PSReadLine 模組,如 所示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)
}
}
(理想情況下,將其放置在適當的設定檔中,以便在 PowerShell 啟動時自動執行。)
這也可以透過升級 PSReadLine 模組來解決,請使用以下說明:https://github.com/lzybkr/PSReadLine/issues/612, 哪個是:
Install-Module PSReadLine -RequiredVersion 2.0.0-beta1 -AllowPrerelease -Scope CurrentUser -SkipPublisherCheck
據推測,PowerShell Core 的未來版本將包含 PSReadLine 模組的固定版本。