A barra de status (statusline) é a faixa no rodapé de cada janela do Vim. Personalizá-la envolve três camadas: o que exibir (itens %), como colorir (grupos de highlight StatusLine, StatusLineNC e User1–User9) e como reagir ao modo atual (autocmds). Este guia monta uma barra completa na paleta Graphite — a mesma do nosso tema de terminal — e corrige os problemas que aparecem quando a configuração roda no Vim de terminal.
Layout da barra construída neste guia:
NORMAL [1] init.lua [+] unix | utf-8 | LUA 45% 12:8
└ modo └ buf/arquivo └ modif. └ formato/encoding/tipo └ % └ l:col
(User0) (User1) (User2) (User1)(User0)
set laststatus=2 " barra sempre visível (padrão do Vim é exibir só com 2+ janelas)
set noshowmode " esconde o -- INSERT -- da linha de comando (a barra já mostra o modo)
| Grupo | Papel |
|---|---|
StatusLine |
Barra da janela ativa |
StatusLineNC |
Barras das janelas inativas (NC = not current) |
User1–User9 |
Grupos livres para colorir segmentos da barra, referenciados pelos itens %1*…%9* |
% usados nesta configuração| Item | Significado |
|---|---|
%N* / %* / %0* |
Passa a usar o grupo UserN / volta ao StatusLine |
%{expr} |
Avalia uma expressão a cada redesenho (modo, flags etc.) |
%n / %t |
Número do buffer / nome do arquivo (só o nome, sem caminho) |
%= |
Separa esquerda de direita (alinha o resto à direita) |
%p%% |
Percentual de rolagem seguido de % literal (ex.: 45%) |
%l:%c |
Linha : coluna do cursor |
\ |
Espaço literal dentro de set statusline (espaços precisam de escape) |
O bloco original desta configuração foi revisado para uso em terminal (veja a seção 3 para o que mudou e por quê):
" ============================================================
" BARRA DE STATUS PERSONALIZADA - CORES GRAPHITE
" ============================================================
" Cores no terminal: com termguicolors, os valores guibg/guifg
" (hex) funcionam também no Vim de terminal
if has('termguicolors')
set termguicolors
endif
" Cores base (Graphite) — gui* para gVim/true color, cterm* como fallback 256
highlight StatusLine gui=bold guibg=#76C893 guifg=#1C1C1E cterm=bold ctermbg=78 ctermfg=234
highlight StatusLineNC gui=none guibg=#3A3A3C guifg=#7A7A7C cterm=none ctermbg=237 ctermfg=244
" Grupos auxiliares (segmentos da barra)
highlight User1 gui=none guifg=#DADADA guibg=#3A3A3C cterm=none ctermfg=253 ctermbg=237
highlight User2 gui=none guifg=#7A7A7C guibg=#1C1C1E cterm=none ctermfg=244 ctermbg=234
highlight User3 gui=bold guifg=#1C1C1E guibg=#F4A623 cterm=bold ctermfg=234 ctermbg=214
" Mudança de cor por modo (requer Vim 8.2.3430+ para ModeChanged)
augroup ModeEvents
autocmd!
" Insert — Azul Graphite
autocmd InsertEnter * highlight StatusLine guibg=#159BEE guifg=#FFFFFF ctermbg=39 ctermfg=255
" Normal — Verde Graphite (cor base)
autocmd InsertLeave * highlight StatusLine guibg=#76C893 guifg=#1C1C1E ctermbg=78 ctermfg=234
" Visual — Roxo Graphite
autocmd ModeChanged *:[vV\x16]* highlight StatusLine guibg=#A24BCF guifg=#FFFFFF ctermbg=134 ctermfg=255
autocmd ModeChanged [vV\x16]*:* highlight StatusLine guibg=#76C893 guifg=#1C1C1E ctermbg=78 ctermfg=234
" Replace — Vermelho Graphite
autocmd ModeChanged *:[R]* highlight StatusLine guibg=#E53E3E guifg=#FFFFFF ctermbg=167 ctermfg=255
autocmd ModeChanged [R]*:* highlight StatusLine guibg=#76C893 guifg=#1C1C1E ctermbg=78 ctermfg=234
augroup END
" Mapa de modos (global, para o item %{} consultar a cada redraw)
let g:currentmode = {
\ 'n': 'NORMAL', 'no': 'N-OPERATOR', 'v': 'VISUAL', 'V': 'V-LINE',
\ "\<C-V>": 'V-BLOCK', 's': 'SELECT', 'S': 'S-LINE', "\<C-S>": 'S-BLOCK',
\ 'i': 'INSERT', 'R': 'REPLACE', 'Rv': 'V-REPLACE', 'c': 'COMMAND',
\ 'cv': 'VIM EX', 'ce': 'EX', 'r': 'PROMPT', 'rm': 'MORE',
\ 'r?': 'CONFIRM', '!': 'SHELL', 't': 'TERMINAL'
\ }
" Composição da barra (definida uma vez; os %{} atualizam sozinhos)
set statusline=
set statusline+=%0*\ %{toupper(get(g:currentmode,\ mode(),\ '···'))}
set statusline+=\ %1*\ [%n]\ %t
set statusline+=%{&modified?'\ [+]':''}
set statusline+=%{&readonly?'\ [RO]':''}
set statusline+=\ %2*%=
set statusline+=%{&fileformat}\ \|\ %{&fileencoding!=#''?&fileencoding:&encoding}
set statusline+=\ \|\ %{&filetype!=#''?toupper(&filetype):'NO\ FT'}
set statusline+=\ %1*\ %p%%
set statusline+=\ %0*\ %l:%c\
Resultado: barra verde no Normal, azul no Insert, roxa no Visual e vermelha no Replace, com buffer/arquivo à esquerda e formato/encoding/tipo/posição à direita.
cterm*)O original definia apenas guibg/guifg — que valem para gVim. No Vim de terminal, sem ctermbg/ctermfg, a barra cai nas cores padrão do tema e todo o efeito se perde. Duas soluções, usadas juntas:
set termguicolors: em terminais com true color (GNOME Terminal, Ptyxis, Kitty, Alacritty), faz os valores hex gui* funcionarem no terminal — ver PS1 e cores no terminal para testar o suporte do seu;cterm*: aproximações da paleta Graphite na escala de 256 cores, para terminais sem true color:| Hex Graphite | cterm mais próximo | Uso na barra |
|---|---|---|
#1C1C1E |
234 |
Fundo escuro / texto sobre cores vivas |
#3A3A3C |
237 |
Segmentos User1, StatusLineNC |
#7A7A7C |
244 |
Texto apagado (User2, inativas) |
#DADADA |
253 |
Texto claro (User1) |
#76C893 |
78 |
Verde — Normal |
#159BEE |
39 |
Azul — Insert |
#A24BCF |
134 |
Roxo — Visual |
#E53E3E |
167 |
Vermelho — Replace |
#F4A623 |
214 |
Âmbar — User3 |
O original usava g:currentmode[mode()] diretamente. A função mode() retorna variantes fora do mapa (niI, ic, ix, nov, Rc, t!...) e a indexação de chave inexistente gera erro E716 a cada redesenho. A correção é o fallback com get():
%{toupper(get(g:currentmode, mode(), '···'))}
O original embrulhava o set statusline numa função chamada uma única vez (call ActiveStatusLine()). Como os itens %{} são reavaliados automaticamente a cada redesenho, a barra pode ser definida diretamente — a função foi removida e o mapa de modos virou variável global.
| Recurso | Versão mínima |
|---|---|
ModeChanged (cores de Visual/Replace) |
Vim 8.2.3430 |
termguicolors |
Vim 7.4.1799 / 8.0 |
| Ubuntu 24.04 (Vim 9.1) e 26.04 | Atendem a tudo |
Em Vim antigo sem
ModeChanged, as cores de Insert/Normal (InsertEnter/InsertLeave) continuam funcionando; Visual e Replace ficam com a cor base.
Se você quer uma barra útil sem troca de cor por modo:
set laststatus=2
set statusline=\ %f\ %m%r%=%y\ \|\ %l:%c\ \|\ %p%%\
" arquivo, [+]/[RO] à esquerda; tipo, posição e % à direita
set laststatus=2 e set noshowmode ativos.termguicolors no meu terminal; se falhar, os cterm* assumem.:split): barra inativa usa StatusLineNC (cinza discreto).:help 'statusline' — todos os itens % disponíveis:help hl-StatusLine e :help hl-User1..9 — grupos de highlight da barra:help ModeChanged — evento de troca de modo (Vim 8.2.3430+):help 'termguicolors' — cores de 24 bits no terminal