Привет, Хабр! Часто ли Вам приходится в сотый раз нажимать стрелку вверх в PowerShell для поиска нужной команды? Или, может быть, не замечать случайные опечатки в длинном пути? Сегодня мы превратим стандартную консоль в удобный инструмент с автодополнением и поиском по истории с помощью модуля PsReadLine. Я поделюсь с Вами готовым конфигом, который сделает ежедневную работу в консоли быстрее и приятнее.

Введение

Работа в стандартной консоли Windows часто сводится к монотонному набору команд, постоянному перелистыванию истории стрелками и борьбе с опечатками, которые обнаруживаются только после ошибки. Это медленно, неудобно и, лично меня откровенно раздражает, особенно после работы в "продвинутых" терминалы в Linux или macOS.

Относительно недавно нашёл PsReadLine. Это модуль для PowerShell, полностью заменяет механизм ввода с клавиатуры, добавляя полезные функции, которые хотелось бы видеть в терминале по умолчанию. В статье хочу не просто рассказать о модуле, а привести готовый конфиг: "предсказание" команд на основе истории, привычные хоткеи и удобный поиск.

К концу статьи у Вас будет файл Microsoft.PowerShell_profile.ps1 с готовой конфигурацией, которая сделает работу комфортнее и удобнее. Приступим...

1. Установка PsReadLine

Безусловно, начать стоит с установки модуля. Самый простой способ - встроенный менеджер пакетов PowerShellGet:

Install-Module -Name PSReadLine -Force -AllowPrerelease
  • -Force - гарантирует установку, даже если есть конфликты.

  • -AllowPrerelease - позволяет установить самую свежую версию. Это важно, потому что именно в ней содержатся самые крутые фичи, вроде предсказания команд (Prediction), о которых мы поговорим дальше. Не пугайтесь слова "prerelease", модуль стабилен.

Возможно Вы столкнетесь с ошибкой: eсли у Вас старая версия PowerShellGet, команда может запросить обновление NuGet или другого поставщика. Смело соглашайтесь, вводя Y.

Можем проверить установку:

Get-Module PSReadLine -ListAvailable

Команда должна показать информацию о установленной версии модуля.

2. Создаём профиль PowerShell

PsReadLine настраивается в вашем профиле PowerShell. Фактически, это скрипт, который выполняется каждый раз при запуске новой сессии. Если у Вас его нет - создадим.

Выполните команду, чтобы узнать путь к Вашему профилю:

echo $PROFILE

Теперь проверим, существует ли файл по этому пути, и создадим его, если это не так:

# Если файла нет, эта команда его создаст
if (!(Test-Path $PROFILE)) {
    New-Item -ItemType File -Path $PROFILE -Force
}

# Откроем профиль в блокноте для редактирования
notepad $PROFILE

Последняя команда откроет пустой файл в Блокноте. Всё, что мы будем добавлять дальше, нужно писать именно в этот файл.

3. Пишем конфиг

Скопируйте и вставьте следующий код в открытый файл профиля. Каждую секцию я подробно прокомментирую.

# Импортируем модуль PsReadLine
Import-Module PSReadLine

# PsReadLine будет анализировать вашу историю и подсказывать следующую команду
Set-PSReadLineOption -PredictionSource History
# Плагин PredictionView делает эти подсказки осязаемыми
Set-PSReadLineOption -PredictionViewStyle ListView

# Эмуляция поиска по истории как в bash (Ctrl+R). Крайне удобно.
Set-PSReadLineKeyHandler -Key Ctrl+r -Function ReverseSearchHistory

# "Умное" завершение пути при нажатии на Ctrl+Space. Показывает все возможные варианты.
Set-PSReadLineKeyHandler -Key Ctrl+Spacebar -Function MenuComplete

После сохранения необходимо перезайти в PowerShell. Теперь при вводе команды появляются подсказки на основе истории (серая строка внизу или справа, в зависимости от версии).

4. Хоткеи и визуал

Базовый конфиг - это хорошо, но ведь можно лучше. Давайте добавим персональные настройки. Снова откроем профиль (notepad $PROFILE) и добавим в конец следующие блоки:

# Копируем и вставляем как человек
Set-PSReadLineKeyHandler -Key Ctrl+c -Function Copy
Set-PSReadLineKeyHandler -Key Ctrl+v -Function Paste

# Перемещение по строке как в современном текстовом редакторе
Set-PSReadLineKeyHandler -Key Ctrl+LeftArrow -Function BackwardWord
Set-PSReadLineKeyHandler -Key Ctrl+RightArrow -Function NextWord
Set-PSReadLineKeyHandler -Key Home -Function BeginningOfLine
Set-PSReadLineKeyHandler -Key End -Function EndOfLine

Меняем цвета на свой вкус:

# Эта настройка меняет цвет подсказок на более приятный
Set-PSReadLineOption -Colors @{
    Command = 'Yellow'
    Parameter = 'Green'
    String = 'DarkCyan'
    InlinePrediction = 'DarkGray'
}

Также, для быстрой проверки команд перед выполнением (ну а вдруг опечатки?) добавляем функцию:

# Быстрая проверка команды перед выполнением клавишей F2
Set-PSReadLineKeyHandler -Key F2 -ScriptBlock {
    $line = $null
    $cursor = $null
    [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)
    
    $firstWord = ($line -split '\s+')[0]
    
    if ($firstWord -and (Get-Command $firstWord -ErrorAction SilentlyContinue)) {
        Write-Host " Command exists" -ForegroundColor Green -NoNewline
    } elseif ($firstWord) {
        Write-Host " Command NOT FOUND" -ForegroundColor Red -NoNewline
    }
    
    [Microsoft.PowerShell.PSConsoleReadLine]::RedrawLine()
}

Результат и проверка

После сохранения профиля и перезапуска PowerShell Ваша консоль должна работать принципиально по-новому.

Давайте протестируем ключевые функции:

  1. Подсказки: введите git sta (если Вы хотя бы раз использовали git). Вы должны увидеть подсказку, например, git status.

  2. Поиск по истории: нажмите Ctrl+R. Внизу появится строка поиска. Начните вводить часть любой команды, которую вы использовали ранее (например, install). PsReadLine будет показывать подходящие варианты из истории.

  3. Проверка корректности: введите команду с ошибкой, например Get-ChilItem и нажмите клавишу F2. В случае неправильного ввода Вы увидите

  4. Меню завершения: введите Get- и нажмите Ctrl+Space. Появится красивое меню со всеми возможными командами.

Итоговый конфиг целиком:

Вот как выглядит полный файл Microsoft.PowerShell_profile.ps1, который у вас должен получиться:

# PsReadLine Configuration - The Ultimate Setup
Import-Module PSReadLine

# Prediction and Completion
Set-PSReadLineOption -PredictionSource History
Set-PSReadLineOption -PredictionViewStyle ListView
Set-PSReadLineOption -ShowToolTips

# Colors
Set-PSReadLineOption -Colors @{
    Command = 'Yellow'
    Parameter = 'Green'
    String = 'DarkCyan'
    InlinePrediction = 'DarkGray'
}

# Key Handlers
Set-PSReadLineKeyHandler -Key Ctrl+r -Function ReverseSearchHistory
Set-PSReadLineKeyHandler -Key Ctrl+Spacebar -Function MenuComplete
Set-PSReadLineKeyHandler -Key Tab -Function Complete
Set-PSReadLineKeyHandler -Key Ctrl+c -Function Copy
Set-PSReadLineKeyHandler -Key Ctrl+v -Function Paste
Set-PSReadLineKeyHandler -Key Ctrl+LeftArrow -Function BackwardWord
Set-PSReadLineKeyHandler -Key Ctrl+RightArrow -Function NextWord
Set-PSReadLineKeyHandler -Key Home -Function BeginningOfLine
Set-PSReadLineKeyHandler -Key End -Function EndOfLine

# Быстрая проверка команды перед выполнением клавишей F2
Set-PSReadLineKeyHandler -Key F2 -ScriptBlock {
    $line = $null
    $cursor = $null
    [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)
    
    $firstWord = ($line -split '\s+')[0]
    
    if ($firstWord -and (Get-Command $firstWord -ErrorAction SilentlyContinue)) {
        Write-Host " Command exists" -ForegroundColor Green -NoNewline
    } elseif ($firstWord) {
        Write-Host " Command NOT FOUND" -ForegroundColor Red -NoNewline
    }
    
    [Microsoft.PowerShell.PSConsoleReadLine]::RedrawLine()
}

Заключение

Насколько необходимо "улучшать" терминал - вопрос открытый. В моем случае это было реализовано из желания "автоматизировать" всё, с чем приходится взаимодействовать. Процесс настройки PsReadLine занимает 10-15 минут, но позволяет работать продуктивнее, меньше отвлекаться. Наиболее полезной добавленной функцией по праву считаю человеческое копирование и вставку...

Особенно хочу отметить пользу для тех, кто мало работает с PowerShell (что меня и побудило найти что-то "вспомогательное"). Фактически, PsReadLine работает как шпаргалка, которая компенсирует отсутствие регулярной практики. Вместо того чтобы каждый раз заново гуглить синтаксис или листать историю стрелками, вы получаете контекстные подсказки прямо в процессе ввода.

В статье используется модуль PsReadLine:
Author: Jason Shirk
License: BSD 2-Clause "Simplified"
Repository: https://github.com/PowerShell/PSReadLine

P. S. В моей группе в Телеграмм разбираем практические кейсы: скрипты (Python/Bash/PowerShell), тонкости ОС и инструменты для эффективной работы.

Комментарии (13)


  1. 0x00FA7A55
    11.11.2025 13:37

    А надо ли тянуть сторонний модуль?

    Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete достаточно, аналог readline (а может и readline) уже зашит в powershell, а для прочих красивостей можно поставить oh-my-posh.

    А вообще сколько powershell не настраивай, даже несмотря на объектную модель и всякие удобства, всё равно оно страшное.


    1. exchange12rocks
      11.11.2025 13:37

      А надо ли тянуть сторонний модуль?

      Но ведь Set-PSReadlineKeyHandler это и есть команда из PSReadLine


    1. eternaladm Автор
      11.11.2025 13:37

      А вообще сколько powershell не настраивай, даже несмотря на объектную модель и всякие удобства, всё равно оно страшное.

      Тут с Вами определенно согласен.

      уже зашит в powershell

      Да, модуль зашит в PowerShell, но по какой-то причине вшитый модуль у меня не завёлся и отказывался обновляться. Пришлось удалять и ставить с нуля. Так как проблема наблюдалась на двух машинах - решил статью с установки начать...

      Также, насколько мне известно, на Win11 была (или есть) проблема с отсутствием данного модуля в PowerShell 5.1.


  1. igrblkv
    11.11.2025 13:37

    А файлы-то разные! По частям и итоговый.


    1. eternaladm Автор
      11.11.2025 13:37

      Да, моя ошибка. Если есть необходимость - ориентируйтесь пока, пожалуйста, на итоговый конфиг, упущенное уже вношу. В процессе написания внёс правки в свой конфиг, но забыл дополнить код в статье...


  1. sundmoon
    11.11.2025 13:37

    PSReadline v2.0 включен и достаточно адекватно настроен по умолчанию даже в Windows Powershell (v5.1), не говоря о Powershell v7.*

    Другое дело, что его есть возможность обновить до v2.4.5 командой
    PS> Install-Module PSReadline -SkipPublisherCheck -Force

    Но и после этого Powershell командлет Set-PSReadLineOption продолжает утверждать, что ему неизвестны ключи -PredictionSource и -PredictionViewStyle и много чего ещё.

    Возможно, у меня продолжает работать устаревшая версия. Чтобы заработала свежая версия, нужно предпринять ещё какие-то нетривиальные телодвижения.


    Так что или я не понимаю, откуда начал автор - явно с далеко не тривиальных настроек, о которых умолчал. Или... склоняюсь к предположению, что все несуществующие ключи в статье - ИИ-галлюцинация.


    1. eternaladm Автор
      11.11.2025 13:37

      PSReadline v2.0 включен и достаточно адекватно настроен по умолчанию даже в Windows Powershell (v5.1), не говоря о Powershell v7.*

      Далеко не во все, модуль достаточно проблемный. По поводу "адекватности" настройки очень спорно, нормальной реализации копирования/вставки нет, поиска по истории - аналогично. "Тыкаюсь по 100 раз, так как потерял команду".

      Другое дело, что его есть возможность обновить до v2.4.5 командойPS> Install-Module PSReadline -SkipPublisherCheck -Force

      Не поймите меня неправильно, повторюсь, модуль проблемный. Тестировал на двух машинах, он отказывался обновляться. Пришлось сносить и ставить уже обновлённый.
      На Win 11 был схожий "прикол". Модуль установлен, но при попытке обновления была ошибка в стиле: Module 'PSReadLine' was not installed

      Но и после этого Powershell командлет Set-PSReadLineOption продолжает утверждать, что ему неизвестны ключи -PredictionSource и -PredictionViewStyle и много чего ещё.

      Да, Вы верно выразились ниже, работает версия 2.0.0, т.е. устаревшая. Я повторно прогнал тесты по своему конфигу на двух машинах, он работает корректно, не выдавая ошибок с перечисленными ключами.

      Или... склоняюсь к предположению, что все несуществующие ключи в статье - ИИ-галлюцинация.

      Ваше предположение основано на том, что у Вас не обновился модуль для корректной работы? Вы можете зайти на GitHub, ссылку на который я прикрепил в конце, найти всю информацию по модулю. Если же у Вас нет времени - прикреплю скриншот с сайта Microsoft...

      Скрин тут:
      Скришнот из статьи Microsoft по модулю PsReadLine
      Скришнот из статьи Microsoft по модулю PsReadLine


      1. sundmoon
        11.11.2025 13:37

        Ну вот и начали бы с изложения этой истории и инструкции, как обновить модуль до релевантной версии.


  1. say_TT_plz
    11.11.2025 13:37

    $env:path = "$env:path,C:\Program Files\Git\usr\bin"

    И у вас доступны команды nano, grep и прочее почти все что доступно в консоли linux.

    Можно добавить на постоянку, хотя пошик в целом удобен, но не как консоль.


  1. Tony-Sol
    11.11.2025 13:37

    Пользуюсь таким конфигом powershell https://github.com/tony-sol/.config/tree/master/powershell уже достаточно давно, поэтому к сожалению не нашел для себя ничего нового :c

    ...мне очень не хватает аналога $RPROMPT из zsh)


    1. dyakalex
      11.11.2025 13:37

      ну дык, как писали выше oh-my-posh в помощь


      1. Tony-Sol
        11.11.2025 13:37

        Да, там есть такой функционал, но я не люблю ни oh-my-posh, ни oh-my-zsh, ни другие фреймворки для шелла. Проще тогда уж на starship перейти кмк


  1. dyakalex
    11.11.2025 13:37

    В том PSReadLine, что идёт из коробки была неприятная багуля с заглавными буквами, после сноса и установки 2.2.6 всё что тут указано у меня работает из коробки, ничего не настраивал.