5

В PowerShell 6.0.1 стандартное поведение заключается в том, что когда я нажимаю « Удалить», когда моя каретка находится не в конце строки, он удаляет символ над кареткой, как и ожидалось. Однако, как только я удаляю последний символ в строке, он перемещает курсор назад на позицию. Я нахожу это очень раздражающим, потому что я больше не могу просто удерживать Delete для удаления до конца строки. Есть ли способ изменить его так, чтобы он вел себя так же, как когда я нажимаю End Delete - т.е. он ничего не делает?

удалить ключ

Исследования проведены:

Я видел отключение звукового сигнала PowerShell для возврата на задний план и подумал, что, возможно, также есть настройка для того, что я хочу, но после прочтения документации по командлету PSReadLine я обнаружил, что ее нет.

Затем я посмотрел на привязки клавиш и запустил Get-PSReadLineKeyHandler чтобы проверить, на что в настоящий момент назначен Delete , а затем искал DeleteChar в кодовой базе PSReadLine , чтобы увидеть определение этой функции и найти что-то подобное. Я нашел 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?

1 ответ1

5

Оказывается, что PowerShell Core 6.0.1 поставляется с версией 1.2 модуля PSReadLine, как замечено Get-Module PSReadLine , но исправление было в https://github.com/lzybkr/PSReadLine/releases/tag/v2.0.0 -бета1. Видя, как этот релиз говорит:

Это первый выпуск репозитория, поддерживающий как 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .