PowerShell Profile com Nerd Fonts e ANSI — Do Zero ao Terminal que Impressiona Já leu

Crie um terminal PowerShell com Nerd Fonts, cores ANSI e prompt personalizado do zero — sem Oh My Posh, só com o que o próprio PowerShell oferece.

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ó oprofile.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 PowerShellAparênciaTipo 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áticosserve 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)

Artigos relacionados