DeletePowerShell 6.0.1 では、キャレットが行末にないときに を押すと、予想どおりキャレットの上の文字が削除されます。ただし、行の最後の文字を削除すると、キャレットが 1 つ前の位置に戻りますDelete。行末まで削除キーを押し続けることができなくなったため、これは非常に煩わしいと思います。 を押したときと同じように動作するように、つまり何もしないように変更する方法はありますかEndDelete?
実施された研究:
私が見たバックスペース時の PowerShell ビープ音を無効にする、そして私が望むもののための設定もあるかもしれないと思ったが、読んだ後PSReadLine コマンドレットのドキュメント、私はそれがないことを見ました。
それからキーバインディングを調べて、現在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そのリリースにはこう書かれています:
これは、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 モジュールの修正バージョンが含まれる予定です。