Passo 4 · Módulo 3 · Ligar · Módulo 3 · Ligar · bat, eza, fzf e zoxide — a camada que o guia só resume
Do guia da Rocketseat ao Warp · Visual Course

bat, eza, fzf e zoxide — a camada que o guia só resume

"Crie aliases e funções personalizadas" cabe numa linha do guia e ocupa um arquivo inteiro na prática. Aqui está esse arquivo, com a paleta Vesper atravessando as quatro ferramentas.

Leia primeiro (fonte primária)
sharkdp/bat — a documentação de temas e configuração

A referência de como o bat resolve tema, config e cache. Esta lição destila o caminho tmTheme → cache → escape ANSI, que é o que permite provar a cor em vez de supor.

Leia a versão simples, ou abra a camada técnica em qualquer seção.
1

A grande ideia


O guia termina com uma frase curta e cheia de trabalho: "garanta que todas essas ferramentas estejam instaladas e configuradas no seu PATH. Crie aliases e funções personalizadas no Fish Shell". Instalar é brew install. Integrar é o resto desta lição.

Pense como… comprar quatro eletrodomésticos bons e deixá-los na caixa: ligados na tomada eles funcionam, mas só viram cozinha quando ficam no lugar certo, na altura certa.

Ao fim desta lição você consegue
  • Ligar eza, bat, fzf e zoxide ao fish num único arquivo removível
  • Compilar um tema Vesper para o bat e provar as cores pelos escapes ANSI
  • Colorir o fzf com a mesma paleta e usar o bat como prévia
  • Entender por que ls só vira eza em sessão interativa
DE INSTALADO A INTEGRADO brew install 5 binários conf.d 1 arquivo aba nova fish relê rsdoctor 5 ok, 0 faltando instalar integrar aplicar provar
A distância entre "instalado" e "integrado" é o segundo passo — o único que o guia resume numa frase.
A CAMADA DE PLUGINS fzf — busca interativa 13 slots de cor eza — listagem com ícones 6 aliases bat — cat com sintaxe tema compilado zoxide — navegação por uso z / zi fd — o backend de arquivos do fzf respeita .gitignore
As quatro ferramentas do guia, mais o fd, que o guia não cita mas é o que torna o fzf rápido.
2

Tudo num arquivo só


A camada inteira mora em ~/.config/fish/conf.d/rocketseat.fish. Apagar o arquivo desfaz tudo — nenhuma linha do seu config.fish foi tocada.

OS ARQUIVOS DA LIÇÃO ~/.config/fish/ [intacto] └─ config.fish starship + zoxide init [intacto] └─ conf.d/rocketseat.fish toda a camada nova [novo] └─ functions/fish_user_key_bindings.fish fzf --fish | source [intacto] ~/.config/bat/ [intacto] └─ config --theme=Vesper [novo] └─ themes/Vesper.tmTheme 17 escopos [novo]
O que a camada de plugins criou e o que ela deliberadamente não tocou.

Os aliases que o guia pede. catn existe para você manter o cat parecido com o original e ainda ter a versão completa quando quiser.

~/.config/fish/conf.d/rocketseat.fish (trecho)
# eza — "moderniza a listagem de arquivos"
alias ls   'eza --icons --group-directories-first'
alias ll   'eza -l --icons --group-directories-first --git --time-style=long-iso'
alias la   'eza -la --icons --group-directories-first --git --time-style=long-iso'
alias lt   'eza --tree --level=2 --icons --group-directories-first'
alias tree 'eza --tree --icons --group-directories-first'

# bat — "versao aprimorada do cat que destaca a sintaxe"
alias cat  'bat --style=plain'   # igual ao cat, so que com sintaxe
alias catn 'bat'                 # com numero de linha, header e diff
set -gx MANPAGER "sh -c 'col -bx | bat -l man -p'"

Como chegar: bat ~/.config/fish/conf.d/rocketseat.fish · fish -n no arquivo checa a sintaxe sem executar.

Esses aliases estão dentro de um if status is-interactive. Por quê?
Porque sobrescrever ls e cat globalmente muda o comportamento de scripts que fazem parsing dessas saídas. Dentro do guard, a sessão interativa ganha os ícones e a sintaxe, e todo script continua falando com os binários reais do sistema.
O alias sobrescreve um comando do sistema? sim status is-interactive só na sessão que você digita não alias solto vale também em script ls, cat, grep, find: sempre atrás do guard.
A decisão que evita um bug silencioso em automação.
alias solto (global) Vale também em script fish Muda a saída de ls para quem faz parsing Surpresa difícil de rastrear depois Ganho estético idêntico dentro de status is-interactive Vale só na sessão que você digita Script continua com os binários reais Zero surpresa em automação Ganho estético idêntico mesmo ganho, risco diferente
As duas formas entregam o mesmo visual. Uma delas também entrega um bug futuro.
3

Vesper no bat, provado por bytes


O bat não vem com Vesper. Dá para escolher um tema parecido — ou compilar o Vesper de verdade, mapeando cada cor da paleta no escopo de sintaxe correspondente.

COMPILANDO UM TEMA PRO bat Vesper.tmTheme plist XML plutil -lint valida bat cache --build compila themes.bin pronto
O caminho de um tema customizado até o bat. O plutil -lint pega erro de XML antes de virar cache.

Cada bloco liga um escopo de sintaxe a uma cor da paleta. #99FFE4 é o verde-menta do Vesper.

~/.config/bat/themes/Vesper.tmTheme (2 dos 17 escopos)
<dict>
  <key>name</key><string>String</string>
  <key>scope</key><string>string, string.quoted, punctuation.definition.string</string>
  <key>settings</key>
  <dict><key>foreground</key><string>#99FFE4</string></dict>
</dict>
<dict>
  <key>name</key><string>Comment</string>
  <key>scope</key><string>comment, punctuation.definition.comment</string>
  <key>settings</key>
  <dict>
    <key>foreground</key><string>#8B8B8B</string>
    <key>fontStyle</key><string>italic</string>
  </dict>
</dict>

Como chegar: plutil -lint ~/.config/bat/themes/Vesper.tmTheme && bat cache --build

terminal — provando o tema pelos escapes $ bat --color=always --style=plain probe.ts | cat -v ^[[38;2;160;160;160mconst^[[0m ^[[38;2;255;255;255mGREETING^[[0m ^[[38;2;153;255;228m"opa"^[[0m ^[[3;38;2;139;139;139m// comentario^[[0m ^[[38;2;255;199;153mhi^[[0m # 153,255,228 = #99FFE4 (string, menta) # 255,199,153 = #FFC799 (funcao, ambar) # 3;... = italico → comentario #8B8B8B
A prova de que o tema aplicou: os escapes ANSI de 24 bits, lidos byte a byte. Não é "parece Vesper" — é o valor RGB exato da paleta.
VESPER MAPEADO EM ESCOPOS DE SINTAXE string #99FFE4 função #FFC799 keyword #A0A0A0 comentário #8B8B8B variável #FFFFFF inválido #FF8080 inserido #90B99F removido #F5A191
Os oito escopos principais do Vesper.tmTheme. É esta paleta que aparece nos escapes ANSI acima.

Olhar a tela prova que alguma cor apareceu. Ler o escape prova qual. Como o bat cai em silêncio para o tema padrão quando o nome não casa ou o cache está velho, a diferença entre "funcionou" e "parece que funcionou" é exatamente essa: 38;2;153;255;228 é #99FFE4 e mais nada. O verify.sh faz essa checagem no bloco D6.

4

Em uma imagem


A mesma paleta do terminal, agora nos 13 slots de cor do fzf — e as prévias saem do bat e do eza.

~/.config/fish/conf.d/rocketseat.fish (fzf)
set -gx FZF_DEFAULT_OPTS "\
--height=60% --layout=reverse --border=rounded --info=inline --prompt='  ' \
--pointer='▌' --marker='+' \
--color=fg:#ffffff,bg:-1,hl:#FFC799 \
--color=fg+:#ffffff,bg+:#232323,hl+:#FFC799 \
--color=info:#A0A0A0,prompt:#99FFE4,pointer:#FFC799 \
--color=marker:#90b99f,spinner:#aca1cf,header:#8B8B8B \
--color=border:#2A2A2A,gutter:-1"

set -gx FZF_DEFAULT_COMMAND 'fd --type f --hidden --follow --exclude .git'
set -gx FZF_CTRL_T_OPTS "--preview 'bat --color=always --style=numbers --line-range=:200 {}'"
set -gx FZF_ALT_C_OPTS  "--preview 'eza --tree --level=2 --icons --color=always {}'"

Como chegar: Teste com Ctrl+T (arquivos) e Alt+C (diretórios) numa sessão fish.

COMO OS PLUGINS SE COMPÕEM Ctrl+T fd --type f fzf bat prévia Alt+C fd --type d fzf eza --tree Ctrl+R histórico fzf z / zi zoxide fzf (zi)
As quatro ferramentas se compondo. O fzf é o meio de campo: quem alimenta é o fd ou o zoxide, quem desenha a prévia é o bat ou o eza.
A CAMADA EM NÚMEROS 6 aliases de eza 2 aliases de bat 13 slots de cor do fzf 3 funções novas
O tamanho real da camada — pequena o bastante para caber em um arquivo e ser lida de uma sentada.
UM CTRL+T, PASSO A PASSO conf.d lido aliases 1 FZF_*_OPTS 13 cores 2 fd indexa sem .git 3 Ctrl+T fzf abre 4 bat prévia Vesper 5 Enter caminho na linha 6
O que acontece entre você apertar Ctrl+T e o caminho aparecer na linha de comando.
QUANTO CADA FERRAMENTA CUSTA DE CONFIG fzf 13 ln eza 6 ln bat 5 ln zoxide 2 ln fd 1 ln
Linhas de configuração por ferramenta nesta camada. O fzf domina porque é o único que precisa da paleta inteira.
terminal — os aliases em uso ❯ ls backup course extract SCOPE.md ❯ ll extract .rw-r--r--@ 6.1k acf 2026-07-25 02:03 guia-rocketseat.md .rw-r--r--@ 3.5k acf 2026-07-25 02:03 raw-page-text.txt .rw-r--r--@ 118k acf 2026-07-25 02:03 raw-page.html
O eza com ícones e permissões coloridas, dentro de um pty real. Os ícones U+E5FF vieram da Nerd Font da lição 2.
5

As funções


Aliases economizam tecla. Funções economizam passo: elas juntam duas ferramentas numa ação só.

ff = achar e abrir. fcd = achar e entrar. O test -n evita rodar o editor quando você aperta Esc.

~/.config/fish/conf.d/rocketseat.fish (funções)
function ff --description 'fuzzy find um arquivo e abre no EDITOR'
    set -l file (fzf --preview 'bat --color=always --style=numbers --line-range=:300 {}')
    test -n "$file"; and $EDITOR $file
end

function fcd --description 'fuzzy find um diretorio e entra nele'
    set -l dir (fd --type d --hidden --follow --exclude .git | fzf --preview 'eza --tree --level=2 --icons --color=always {}')
    test -n "$dir"; and cd $dir
end

Como chegar: Digite ff em qualquer diretório. functions ff mostra o corpo da função.

Três funções chegaram junto com os aliases:

  • ff — busca um arquivo e abre no seu editor
  • fcd — busca um diretório e entra nele
  • rsdoctor — mostra o estado da stack inteira

Funções em conf.d/ ficam disponíveis imediatamente, sem autoload — diferente das que moram em functions/<nome>.fish, que o fish carrega sob demanda. Para três funções pequenas isso é irrelevante; para uma biblioteca grande, o autoload é o certo, porque cada arquivo de conf.d/ é lido em toda sessão, inclusive não-interativa.

terminal — rsdoctor ❯ rsdoctor stack do guia da Rocketseat — sessao atual terminal : WarpTerminal shell : fish, version 4.6.0 starship : OK /opt/homebrew/bin/starship bat : OK /opt/homebrew/bin/bat zoxide : OK /opt/homebrew/bin/zoxide eza : OK /opt/homebrew/bin/eza fzf : OK /opt/homebrew/bin/fzf fonte Warp : JetBrainsMono Nerd Font honor_ps1 : true resultado : 5 ok, 0 faltando
O rsdoctor em execução real. É o diagnóstico de um comando quando alguma coisa parar de aparecer.
FISH
Por que ls só vira eza em sessão interativa?
clique para virar
Para que scripts continuem usando o binário real. Alias global muda a saída para quem faz parsing e vira bug difícil de achar.
BAT
Como provar que o tema Vesper aplicou?
clique para virar
Lendo os escapes ANSI: 38;2;153;255;228 é exatamente #99FFE4. Olhar a tela só prova que alguma cor apareceu.
FZF
Quem alimenta o fzf e quem desenha a prévia?
clique para virar
fd (ou o zoxide) alimenta; bat desenha a prévia de arquivo e eza --tree a de diretório.
6

Experimente


Montar sua camada de plugins
1
brew install bat zoxide eza fzf fd
2
Crie ~/.config/fish/conf.d/rocketseat.fish com os aliases e as variáveis de cor do fzf
3
Cheque a sintaxe sem executar: fish -n ~/.config/fish/conf.d/rocketseat.fish
4
Abra uma sessão nova e rode rsdoctor
Agora você: troque as cores do FZF_DEFAULT_OPTS pela paleta do seu tema — os 13 slots são fg, bg, hl, fg+, bg+, hl+, info, prompt, pointer, marker, spinner, header, border.
Revisão da lição 4
Você quer que ls mostre ícones sem quebrar seus scripts. Como?
a está certa: o guard resolve na origem, sem exigir disciplina em cada script. b funciona mas transfere o custo para todo script futuro, inclusive os que você não escreveu. c reinventa o guard com mais superfície de erro — e o eza já decide cor por tty sozinho.
O bat mostra cores, mas não parecem as do Vesper. Qual é o teste decisivo?
c está certa: o RGB do escape é o valor exato, sem interpretação. b prova que o tema foi compilado, não que ele está sendo usado nesta chamada. a depende do seu monitor, do perfil de cor e do olho — não é prova.
Tudo montado. Falta a parte que quase ninguém faz: provar. A próxima lição é sobre os três bugs que só apareceram porque a verificação aconteceu num boundary real.