Como usar o módulo PSReadLine para turbinar o terminal PowerShell

1. Introdução ao PSReadLine

O PSReadLine é um módulo essencial para qualquer profissional que utiliza o PowerShell de forma intensiva. Ele substitui a experiência padrão de edição de linha de comando por um ambiente muito mais produtivo, com recursos como histórico persistente, busca incremental, preenchimento automático inteligente (Predictive IntelliSense) e atalhos de teclado avançados.

Sem o PSReadLine, o terminal PowerShell oferece apenas funcionalidades básicas de navegação e edição. Com ele, você ganha recursos que aumentam significativamente a velocidade de execução de tarefas repetitivas.

Para verificar a versão instalada do PSReadLine, execute:

Get-Module PSReadLine -ListAvailable | Select-Object Name, Version

Para atualizar para a versão mais recente:

Update-Module PSReadLine

2. Instalação e configuração inicial

O PSReadLine já vem instalado por padrão no PowerShell 5.0 ou superior, mas você pode instalá-lo manualmente via PowerShell Gallery:

Install-Module PSReadLine -Force -AllowClobber

Para que o módulo seja carregado automaticamente em toda sessão, edite seu perfil do PowerShell. O arquivo de perfil geralmente está em:

notepad $PROFILE

Caso o arquivo não exista, crie-o com:

New-Item -Path $PROFILE -ItemType File -Force

Adicione ao perfil as seguintes linhas:

Import-Module PSReadLine
Set-PSReadLineOption -EditMode Windows

3. Personalização de histórico e busca

O histórico persistente é um dos recursos mais valiosos do PSReadLine. Ele salva todos os comandos executados entre sessões, permitindo busca rápida.

Para configurar o histórico:

Set-PSReadLineOption -MaximumHistoryCount 10000
Set-PSReadLineOption -HistorySaveStyle SaveIncrementally

Os atalhos de busca incremental são extremamente úteis:

  • Ctrl+R: Busca reversa no histórico (digite parte do comando)
  • Ctrl+S: Busca direta no histórico

Para filtrar comandos sensíveis do histórico (como senhas):

Set-PSReadLineOption -AddToHistoryHandler {
    param($line)
    $sensitive = @('password', 'secret', 'token')
    $sensitive -notcontains ($line -split ' ')[0]
}

4. Autocomplete inteligente com Predictive IntelliSense

O Predictive IntelliSense é o recurso que mais turbina a produtividade. Ele sugere comandos completos baseados no seu histórico e contexto atual.

Para ativar:

Set-PSReadLineOption -PredictionSource History

Para usar sugestões baseadas em histórico e comandos recentes:

Set-PSReadLineOption -PredictionSource HistoryAndPlugin

Personalize as cores das sugestões:

Set-PSReadLineOption -Colors @{
    InlinePrediction = '#808080'
    Prediction = '#808080'
    PredictionSelected = '#1E90FF'
}

5. Atalhos de edição e navegação no terminal

O PSReadLine oferece atalhos que tornam a edição de comandos muito mais ágil:

Navegação rápida:
- Ctrl+LeftArrow: Move para o início da palavra anterior
- Ctrl+RightArrow: Move para o início da próxima palavra
- Home: Início da linha
- End: Fim da linha

Edição de texto:
- Ctrl+Backspace: Deleta palavra anterior
- Ctrl+Delete: Deleta próxima palavra
- Ctrl+W: Deleta palavra anterior (similar ao bash)
- Ctrl+U: Deleta toda a linha
- Ctrl+K: Deleta do cursor até o fim da linha

Copiar e colar:
- Ctrl+Shift+C: Copiar seleção
- Ctrl+Shift+V: Colar texto

Undo e Redo:
- Ctrl+Z: Desfazer última ação
- Ctrl+Y: Refazer ação desfeita

6. Criação de funções e aliases personalizados

Você pode criar funções no perfil do PowerShell para comandos frequentes. Exemplo prático:

function Deploy-Project {
    param([string]$Environment = "dev")
    Write-Host "Iniciando deploy para $Environment..."
    git pull origin main
    dotnet build --configuration Release
    dotnet publish -c Release -o ./publish
    Write-Host "Deploy concluído!" -ForegroundColor Green
}

Para criar aliases com PSReadLine:

Set-Alias -Name dp -Value Deploy-Project
Set-Alias -Name gs -Value Get-Service

Outros exemplos úteis para o perfil:

function Get-SystemReport {
    Get-ComputerInfo | Select-Object WindowsVersion, WindowsBuildLabEx, BiosManufacturer, BiosVersion
}

function Get-LastCommands {
    Get-Content (Get-PSReadLineOption).HistorySavePath | Select-Object -Last 20
}

7. Integração com outras ferramentas do ecossistema PowerShell

O PSReadLine pode ser combinado com outras ferramentas para criar fluxos de trabalho poderosos.

Exportando comandos executados para CSV:

function Export-CommandHistory {
    param([string]$Path = ".\command_history.csv")
    Get-Content (Get-PSReadLineOption).HistorySavePath |
        Select-Object @{Name="Command";Expression={$_}},
                      @{Name="Timestamp";Expression={(Get-Date)}} |
        Export-Csv -Path $Path -NoTypeInformation
}

Usando com scripts de agendamento:

Register-ScheduledJob -Name "BackupLogs" -ScriptBlock {
    Import-Module PSReadLine
    $history = Get-Content (Get-PSReadLineOption).HistorySavePath
    $history | Out-File "C:\Logs\command_history_$(Get-Date -Format 'yyyyMMdd').log"
} -Trigger (New-JobTrigger -Daily -At "02:00")

Combinando com histórico do Active Directory:

function Search-ADHistory {
    param([string]$SearchTerm)
    Get-Content (Get-PSReadLineOption).HistorySavePath |
        Where-Object {$_ -match $SearchTerm -and $_ -match "Get-ADUser|Get-ADGroup|Set-ADUser"}
}

8. Dicas avançadas e boas práticas

Configurando temas e cores:

Set-PSReadLineOption -Colors @{
    Command = '#FFFF00'
    Parameter = '#00FF00'
    Variable = '#FF00FF'
    String = '#FFA500'
    Number = '#00FFFF'
}

Evitando conflitos com outros módulos:

Sempre carregue o PSReadLine antes de outros módulos que modificam o prompt:

# Ordem correta no perfil
Import-Module PSReadLine
Import-Module posh-git  # ou outros módulos

Depuração de problemas comuns:

Para verificar se o PSReadLine está funcionando corretamente:

Get-PSReadLineKeyHandler | Out-GridView

Para resetar configurações:

Remove-Module PSReadLine
Import-Module PSReadLine

Otimização de desempenho:

Limite o histórico a um número razoável de entradas:

Set-PSReadLineOption -MaximumHistoryCount 5000

Desabilite recursos não utilizados:

Set-PSReadLineOption -HistoryNoDuplicates

Referências