Por que não usar Oh My Posh?
A maioria dos tutoriais sobre personalização de terminal no Windows — incluindo o excelente artigo da TechTarget e os guias da Microsoft Learn — aponta para Oh My Posh como solução padrão. É uma ótima ferramenta, mas tem um custo:
| Abordagem | Dependência externa | Tempo de carregamento | Configuração |
|---|---|---|---|
| Oh My Posh | Sim (binário + JSON) | ~200–400ms | Arquivo .omp.json |
| Este guia (ANSI puro) | Nenhuma | ~10–30ms | Só o profile.ps1 |
Se você quer um terminal bonito, rápido e que funcione em qualquer máquina onde só você copie um único arquivo — este é o caminho.
Pré-requisitos
1. Instale uma Nerd Font
As Nerd Fonts são fontes de desenvolvimento com milhares de ícones embutidos (Git, pastas, linguagens, etc.). Baixe em:
👉 https://www.nerdfonts.com/font-downloads
Recomendadas: Hack Nerd Font, JetBrainsMono Nerd Font ou CaskaydiaCove Nerd Font.
Instale a fonte no Windows:
Extraia o .zip → Selecione os arquivos .ttf → Clique com botão direito → "Instalar para todos os usuários"
Ou copie para C:\Windows\Fonts\ manualmente.
2. Configure a fonte no Windows Terminal
Abra Configurações (Ctrl+,) → selecione o perfil PowerShell → Aparência → Tipo de fonte → escolha a Nerd Font instalada.
Ou edite settings.json diretamente (Ctrl+Shift+,):
{
"profiles": {
"defaults": {
"font": {
"face": "Hack Nerd Font"
}
}
}
}
Onde fica o perfil do PowerShell?
O PowerShell carrega automaticamente um script de perfil ao iniciar — a menos que você use a flag -NoProfile. Para saber onde está o seu:
# Caminho do perfil atual
$PROFILE
# Ver todos os caminhos disponíveis
$Profile | Get-Member -MemberType NoteProperty
Os caminhos mais comuns no Windows:
| Escopo | Caminho |
|---|---|
| Usuário atual (PowerShell 7+) | $HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 |
| Usuário atual (Windows PowerShell 5.x) | $HOME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 |
| Todos os usuários | $PSHOME\profile.ps1 |
Se o arquivo não existir, crie-o:
if (!(Test-Path $PROFILE)) {
New-Item -Path $PROFILE -ItemType File -Force
}
---
O que este profile faz — e o que outros não fazem
Recursos exclusivos deste setup
Zero dependências — funciona em qualquer máquina com PowerShell 5.1+
Detecção de contexto por projeto — ícone e versão do PHP só aparecem se houver composer.json ou arquivos .php; Node só aparece se houver package.json
Título da janela dinâmico — mostra user@host: pasta na barra do Windows Terminal
Exit code preservado — $LASTEXITCODE é salvo e restaurado para não quebrar scripts que verificam o código de saída após o prompt
Prompt em duas linhas — a linha de escrita fica sempre limpa, sem truncar caminhos longos
Aliases práticos — serve para PHP dev server, além de outros que desejar
O que artigos comuns cobrem (e este também cobre, mas vai além)
| Feature | TechTarget | Microsoft Learn | Este guia |
|---|---|---|---|
| Prompt customizado | |||
| básico | |||
| via Oh My Posh | |||
| ANSI nativo | |||
| Aliases | |||
| Detecção de ambiente (prod/dev) | |||
| por hostname | ❌ | ||
| por arquivos do projeto | |||
| Ícones Nerd Font | ❌ | ||
| via Oh My Posh | |||
| codepoints diretos | |||
| Info de linguagem no prompt | ❌ | ❌ | |
| PHP + Node + Git | |||
| Preservar exit code | ❌ | ❌ | |
| Sem dependência externa | ❌ | ❌ |
Entendendo o script linha a linha
Ícones via codepoints Unicode
$FOLDER = [char]0xf07b # pasta
$PHP = [char]0xe608 # PHP
$NODE = [char]0xe718 # Node.js
$GIT = [char]0xe702 # Git branch
$LAMBDA = [char]0x03bb # λ símbolo prompt
Cada [char]0x???? converte um codepoint Unicode diretamente para o caractere. As Nerd Fonts mapeiam esses codepoints para ícones. Nenhuma biblioteca necessária.
💡 Dica: Para descobrir outros ícones, acesse nerdfonts.com/cheat-sheet e copie o codepoint hex.
Cores ANSI nativas
$ESC = [char]0x1b
$RED = "$ESC[31m"
$GREEN = "$ESC[32m"
$YELLOW = "$ESC[33m"
$BLUE = "$ESC[34m"
$MAGENTA = "$ESC[35m"
$CYAN = "$ESC[36m"
$BOLD = "$ESC[1m"
$RESET = "$ESC[0m"
São sequências de escape ANSI — o padrão universal de cores em terminais. Funcionam no Windows Terminal, VS Code, e qualquer emulador moderno. Sem módulos, sem Write-Host colorido, sem gambiarra.
Detecção de contexto por projeto
function Get-PhpInfo {
$hasPhpFiles = (Test-Path "composer.json") -or
(Get-ChildItem "*.php" -ErrorAction SilentlyContinue | Select-Object -First 1)
if ($hasPhpFiles -and (Get-Command php -ErrorAction SilentlyContinue)) {
$ver = (& php -v 2>$null | Select-Object -First 1) -replace '^PHP (\S+).*', '$1'
return " $BLUE$PHP $ver$RESET"
}
return ""
}
A lógica é elegante: só exibe a versão do PHP se você estiver numa pasta que parece um projeto PHP. Evita poluição visual quando você está em pastas não relacionadas.
O mesmo padrão se aplica ao Node (detecta package.json) e ao Git (git rev-parse --git-dir).
Preservando o exit code — detalhe que ninguém menciona
function Prompt {
$lastExit = $LASTEXITCODE
# ... monta o prompt ...
$global:LASTEXITCODE = $lastExit
return $p
}
Esse é um dos detalhes mais ignorados em tutoriais de customização de prompt: a função Prompt em si executa comandos (como git branch) que sobrescrevem $LASTEXITCODE. Se um script externo checa o código de saída após rodar um comando, o valor pode estar corrompido pelo prompt. Este perfil salva e restaura o valor corretamente.
Instalação em uma linha
Copie o arquivo para o caminho correto:
# PowerShell 7+
Copy-Item .\Microsoft.PowerShell_profile.ps1 "$HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1"
# Windows PowerShell 5.x
Copy-Item .\Microsoft.PowerShell_profile.ps1 "$HOME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"
Depois recarregue o perfil sem fechar o terminal:
. $PROFILE
---
Sincronizando o perfil entre máquinas
Como mencionado no artigo da TechTarget, você pode usar um GitHub Gist para sincronizar o perfil entre máquinas. A vantagem: é público, versionado e pode ser baixado com uma linha:
# Baixar e aplicar diretamente de um Gist
$gist = Invoke-RestMethod https://api.github.com/gists/SEU_GIST_ID
$gist.files."Microsoft.PowerShell_profile.ps1".content | Out-File $PROFILE
⚠️ Atenção: Só use Gists públicos se seu perfil não contiver informações sensíveis (caminhos internos, credenciais, nomes de servidores).
Para criar o Gist via CLI do GitHub:
gh gist create --public --desc "PowerShell Profile com Nerd Fonts, ANSI colors, Git, PHP, Node e Fastfetch" Microsoft.PowerShell_profile.ps1
Download do script
Aqui eu deixo um script bem bacana que usa a fonte citada e mostra icones das pastas e das ferramentas (git, php, node, etc):
👉 Baixar Microsoft.PowerShell_profile.ps1
Resultado final
Ao abrir o terminal com este perfil configurado, você verá algo como:
user@DESKTOP projeto-php main PHP 8.3.4
λ _
- **Verde:** usuário
- **Ciano:** hostname
- **Amarelo:** pasta atual com ícone
- **Magenta:** branch Git com ícone
- **Azul:** versão do PHP com ícone (só em projetos PHP)
- **Verde:** `node v20.11.0` (só em projetos Node)
- **λ:** o cursor, na linha seguinte — sempre limpo
---
## Referências
- [How to find and customize your PowerShell profile — TechTarget](https://www.techtarget.com/searchwindowsserver/tutorial/How-to-find-and-customize-your-PowerShell-profile)
- [Windows Terminal Custom Prompt Setup — Microsoft Learn](https://learn.microsoft.com/en-us/windows/terminal/tutorials/custom-prompt-setup)
- [Nerd Fonts — nerdfonts.com](https://www.nerdfonts.com)
- [ANSI escape codes — Wikipedia](https://en.wikipedia.org/wiki/ANSI_escape_code)