" ~/.vimrc - Configuração Vim harmonizada com tema Graphite
" ============================================================
" Use za para abrir/fechar fold atual | zR para abrir todos | zM para fechar todos
" Teclas Z e N minúsculos mapeados para expandir/recolher todos os folds
" ============================================================
" 1. CONFIGURAÇÕES FUNDAMENTAIS {{{1
" ============================================================
" Não necessário quando ~/.vimrc existe, mas mantido para compatibilidade
set nocompatible
" Ativar cores verdadeiras do terminal (24-bit)
if has('termguicolors')
set termguicolors
endif
" ============================================================
" 2. GERENCIAMENTO DE PLUGINS (vim-plug) {{{1
" ============================================================
call plug#begin('~/.vim/plugged')
" Tema base (usaremos apenas como referência, cores customizadas abaixo)
Plug 'joshdick/onedark.vim'
" Suporte a linguagens
Plug 'hashivim/vim-terraform'
Plug 'pearofducks/ansible-vim'
Plug 'sheerun/vim-polyglot'
call plug#end()
" ============================================================
" 3. CONFIGURAÇÕES GERAIS {{{1
" ============================================================
filetype plugin indent on
syntax on
set title " Mostra nome do arquivo no título
set encoding=utf-8 " Codificação UTF-8
set backspace=indent,eol,start " Backspace funciona em todos os contextos
set noerrorbells " Sem sons de erro
set confirm " Confirmação ao sair com alterações
set hidden " Permite trocar de buffer sem salvar
set splitbelow " Splits abrem abaixo
set splitright " Splits abrem à direita
set scrolloff=5 " Mantém 5 linhas visíveis acima/abaixo do cursor
set cursorline " Destaca linha atual
set lazyredraw " Melhora performance em macros
set updatetime=300 " Tempo de resposta mais rápido
" ============================================================
" 4. CAMINHOS E ARQUIVOS TEMPORÁRIOS {{{1
" ============================================================
set path+=** " Busca recursiva em subdiretórios
set noswapfile " Desativa arquivos swap
set nobackup " Desativa backup automático
" Diretório de undo persistente
set undodir=~/.vim/undodir
set undofile " Mantém histórico de undo entre sessões
" Criar diretório de undo se não existir
if !isdirectory($HOME . "/.vim/undodir")
call mkdir($HOME . "/.vim/undodir", "p", 0700)
endif
" ============================================================
" 5. NUMERAÇÃO E NAVEGAÇÃO VISUAL {{{1
" ============================================================
set number " Número absoluto na linha atual
set relativenumber " Números relativos nas outras linhas
set signcolumn=yes " Coluna de sinais sempre visível
set colorcolumn=80,120 " Marca colunas 80 e 120
" ============================================================
" 6. CURSOR PERSONALIZADO (forma por modo) {{{1
" ============================================================
" Barra vertical no insert, bloco no normal
let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"
let &t_SR = "\e[4 q" " Substituição: underline
" ============================================================
" 7. INDENTAÇÃO E TABULAÇÃO {{{1
" ============================================================
set autoindent " Herda indentação da linha anterior
set smartindent " Indentação inteligente para código
set expandtab " Converte tabs em espaços
set tabstop=2 " Tab = 2 espaços
set softtabstop=2 " Tab no insert = 2 espaços
set shiftwidth=2 " Indentação com >> ou << = 2 espaços
set shiftround " Arredonda indentação para múltiplo de shiftwidth
" ============================================================
" 8. BUSCA E SUBSTITUIÇÃO {{{1
" ============================================================
set ignorecase " Busca ignora case...
set smartcase " ...a menos que tenha maiúsculas
set incsearch " Busca incremental (em tempo real)
set hlsearch " Destaca resultados da busca
set gdefault " Substituição global por padrão (:%s//g)
" Limpar highlight de busca com Escape
nnoremap <silent> <Esc> :nohlsearch<CR><Esc>
" Limpar highlight ao iniciar
let @/ = ""
" ============================================================
" 9. MENU E COMPLETAMENTO {{{1
" ============================================================
set wildmenu " Menu de completamento visual
set wildmode=longest:full,full " Comportamento do wildmenu
set wildoptions=pum " Menu popup para wildmenu
set wildcharm=<C-Z> " Caractere para ativar wildmenu em mapeamentos
set wildignore+=*.pyc,*.o,*.obj,*.class,*.jar
set wildignore+=*.zip,*.tar.gz,*.tar.bz2
set wildignore+=node_modules/*,.git/*,__pycache__/*,vendor/*
set wildignore+=*.jpg,*.jpeg,*.png,*.gif,*.ico
" Completamento no modo insert
set complete+=kspell " Inclui dicionário de ortografia
set completeopt=menuone,longest,noselect,noinsert
set shortmess+=c " Mensagens mais curtas para completamento
" ============================================================
" 10. BARRA DE STATUS {{{1
" ============================================================
set noshowmode " Não mostra modo (status line faz isso)
set laststatus=2 " Barra de status sempre visível
" ============================================================
" 11. QUEBRA DE LINHA E VISUALIZAÇÃO {{{1
" ============================================================
set nowrap " Não quebra linhas automaticamente
set linebreak " Quebra em caracteres de palavra quando wrap está on
set breakindent " Mantém indentação em linhas quebradas
set showbreak=↳\ " Indicador de continuação de linha
" ============================================================
" 12. FOLDING (DOBRAS) {{{1
" ============================================================
set foldmethod=marker " Usa {{{ e }}} para marcar folds
set foldlevelstart=99 " Abre todos os folds ao iniciar
set foldcolumn=1 " Mostra coluna de indicadores de fold
" Mapeamentos personalizados para folding
nnoremap z zR " z minúsculo: abre todos os folds
nnoremap n zM " n minúsculo: fecha todos os folds
nnoremap <leader>z za " Leader+z: toggle fold atual
" ============================================================
" 13. CARACTERES INVISÍVEIS E PREENCHIMENTO {{{1
" ============================================================
set nolist " Caracteres invisíveis desativados por padrão
set listchars=tab:›-,space:·,trail:⋯,eol:↲,extends:»,precedes:«,nbsp:␣
set fillchars=vert:│,fold:─,eob:~,lastline:@,diff:─
" Toggle para mostrar/esconder caracteres invisíveis
nnoremap <F5> :set list!<CR>:set list?<CR>
" ============================================================
" 14. ORTOGRAFIA {{{1
" ============================================================
set nospell " Ortografia desativada por padrão
set spelllang=pt_br,en " Dicionários: português e inglês
" Toggle ortografia com F6
nnoremap <F6> :set spell!<CR>:set spell?<CR>
" ============================================================
" 15. TEMA E CORES - HARMONIZADO COM GRAPHITE {{{1
" ============================================================
" Fundo escuro (herda do terminal Graphite #1C1C1E)
set background=dark
colorscheme onedark " Carrega esquema base
" --- CORES NEUTRAS (família Graphite) ---
" Fundo transparente para herdar do terminal
highlight Normal guibg=NONE ctermbg=NONE guifg=#DADADA
" Linha do cursor - tom acima do fundo
highlight CursorLine guibg=#242426 ctermbg=236
" Coluna colorida - mesmo tom do CursorLine (coesão visual)
highlight ColorColumn guibg=#242426 ctermbg=236
" Seleção visual - tom intermediário
highlight Visual guibg=#3A3A3C ctermbg=237 guifg=NONE
" Divisão de janelas - sutil
highlight VertSplit guibg=NONE ctermbg=NONE guifg=#3A3A3C ctermfg=237
" --- ABAS (Tab Line) ---
highlight TabLine guifg=#7A7A7C guibg=#242426 gui=none cterm=none
highlight TabLineSel guifg=#DADADA guibg=#1C1C1E gui=bold cterm=bold
highlight TabLineFill guifg=#7A7A7C guibg=#242426 gui=none cterm=none
" --- DOBRAS (Folding) ---
highlight Folded guibg=NONE guifg=#6A6A6C gui=italic cterm=italic
highlight FoldColumn guibg=NONE guifg=#5A5A5C
" --- OUTROS ELEMENTOS ---
" Comentários em itálico
highlight Comment cterm=italic gui=italic guifg=#6A6A6C
" Linha de números
highlight LineNr guifg=#5A5A5C guibg=NONE
highlight CursorLineNr guifg=#DADADA guibg=NONE gui=bold
" Coluna de sinais
highlight SignColumn guibg=NONE
" Correspondência de parênteses
highlight MatchParen guibg=#3A3A3C guifg=#F4A623 gui=bold
" Seleção no modo visual (linha)
highlight Visual guibg=#3A3A3C guifg=NONE
" ============================================================
" 16. BARRA DE STATUS PERSONALIZADA - CORES GRAPHITE {{{1
" ============================================================
" Cores base da status line (cores do tema Graphite)
highlight StatusLine gui=bold guibg=#76C893 guifg=#1C1C1E cterm=bold
highlight StatusLineNC gui=none guibg=#3A3A3C guifg=#7A7A7C cterm=none
" Mudança de cor por modo (usando paleta Graphite)
augroup ModeEvents
autocmd!
" Modo Insert - Azul Graphite (#159BEE)
autocmd InsertEnter * highlight StatusLine guibg=#159BEE guifg=#FFFFFF
" Volta ao Normal - Verde Graphite (#76C893)
autocmd InsertLeave * highlight StatusLine guibg=#76C893 guifg=#1C1C1E
" Modo Visual - Roxo Graphite (#A24BCF)
autocmd ModeChanged *:[vV\x16]* highlight StatusLine guibg=#A24BCF guifg=#FFFFFF
autocmd ModeChanged [vV\x16]*:* highlight StatusLine guibg=#76C893 guifg=#1C1C1E
" Modo Replace - Vermelho Graphite (#E53E3E)
autocmd ModeChanged *:[R]* highlight StatusLine guibg=#E53E3E guifg=#FFFFFF
autocmd ModeChanged [R]*:* highlight StatusLine guibg=#76C893 guifg=#1C1C1E
augroup END
" Cores auxiliares para status line
highlight User1 gui=none guifg=#DADADA guibg=#3A3A3C cterm=none
highlight User2 gui=none guifg=#7A7A7C guibg=#1C1C1E cterm=none
highlight User3 gui=bold guifg=#1C1C1E guibg=#F4A623 cterm=bold
" Função para construir a status line
function! ActiveStatusLine()
" Mapeamento de modos
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'
\ }
" Componentes da status line
set statusline=
" Modo atual (cor dinâmica)
set statusline+=%0*\ %{toupper(g:currentmode[mode()])}
" Buffer e nome do arquivo
set statusline+=\ %1*\ [%n]\ %t
" Indicador de modificado
set statusline+=%{&modified?'\ [+]':''}
set statusline+=%{&readonly?'\ [RO]':''}
" Separador e alinhamento à direita
set statusline+=\ %2*%=
" Informações do arquivo
set statusline+=%{&fileformat}\ \|\ %{&fileencoding!=#''?&fileencoding:&encoding}
set statusline+=\ \|\ %{&filetype!=#''?toupper(&filetype):'NO\ FT'}
" Posição do cursor
set statusline+=\ %1*\ %p%%
set statusline+=\ %0*\ %l:%c\
endfunction
" Inicializar status line
call ActiveStatusLine()
" ============================================================
" 17. MAPEAMENTOS PERSONALIZADOS {{{1
" ============================================================
" Líder: espaço
let mapleader = " "
let maplocalleader = "\\"
" --- Navegação entre splits ---
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
" Redimensionar splits
nnoremap <C-Left> :vertical resize -2<CR>
nnoremap <C-Right> :vertical resize +2<CR>
nnoremap <C-Up> :resize -2<CR>
nnoremap <C-Down> :resize +2<CR>
" --- Manipulação de buffers ---
nnoremap <leader>w :w<CR>
nnoremap <leader>W :wa<CR>
nnoremap <leader>q :q<CR>
nnoremap <leader>Q :qa<CR>
nnoremap <leader>x :x<CR>
" --- Movimentação de linhas ---
nnoremap <A-j> :m .+1<CR>==
nnoremap <A-k> :m .-2<CR>==
inoremap <A-j> <Esc>:m .+1<CR>==gi
inoremap <A-k> <Esc>:m .-2<CR>==gi
vnoremap <A-j> :m '>+1<CR>gv=gv
vnoremap <A-k> :m '<-2<CR>gv=gv
" --- Indentação mantendo seleção ---
vnoremap > >gv
vnoremap < <gv
" --- Busca e substituição rápida ---
nnoremap <leader>s :%s//g<Left><Left>
vnoremap <leader>s :s//g<Left><Left>
nnoremap <leader>S :%s//gc<Left><Left><Left>
" --- Explorador de arquivos nativo ---
nnoremap <leader>e :Explore<CR>
nnoremap <leader>E :Vexplore<CR>
" --- Centralizar tela durante navegação ---
nnoremap n nzzzv
nnoremap N Nzzzv
nnoremap * *zzzv
nnoremap # #zzzv
nnoremap g* g*zzzv
nnoremap g# g#zzzv
nnoremap <C-d> <C-d>zz
nnoremap <C-u> <C-u>zz
" --- Manipulação de janelas ---
nnoremap <leader>v <C-w>v
nnoremap <leader>h <C-w>s
nnoremap <leader>c <C-w>c
nnoremap <leader>o <C-w>o
" --- Yank para o clipboard do sistema ---
nnoremap <leader>y "+y
vnoremap <leader>y "+y
nnoremap <leader>Y "+Y
" --- Colar do clipboard do sistema ---
nnoremap <leader>p "+p
vnoremap <leader>p "+p
nnoremap <leader>P "+P
" --- Desativar setas no modo normal (força uso de hjkl) ---
nnoremap <Up> :echoe "Use k"<CR>
nnoremap <Down> :echoe "Use j"<CR>
nnoremap <Left> :echoe "Use h"<CR>
nnoremap <Right> :echoe "Use l"<CR>
" ============================================================
" 18. AUTOMAÇÕES E EVENTOS {{{1
" ============================================================
augroup VimrcAutocmds
autocmd!
" Reposição do cursor na última posição ao reabrir arquivo
autocmd BufReadPost *
\ if line("'\"") >= 1 && line("'\"") <= line("$") && &ft !~# 'commit'
\ | execute "normal! g`\""
\ | endif
" Destacar yank (flash visual breve)
autocmd TextYankPost * silent! lua vim.highlight.on_yank({higroup="Visual", timeout=200})
" Ajustar foldmethod para tipos específicos
autocmd FileType vim setlocal foldmethod=marker
autocmd FileType python setlocal foldmethod=indent foldnestmax=2
autocmd FileType yaml setlocal foldmethod=indent foldnestmax=3
autocmd FileType json setlocal foldmethod=syntax foldnestmax=2
" Remover trailing whitespace ao salvar
autocmd BufWritePre * %s/\s\+$//e
" Atualizar arquivo apois mudança externa
autocmd FocusGained,BufEnter * checktime
augroup END
" ============================================================
" 19. CONFIGURAÇÕES POR TIPO DE ARQUIVO {{{1
" ============================================================
" Python
autocmd FileType python setlocal tabstop=4 shiftwidth=4 softtabstop=4 expandtab
" Makefile (requer tabs reais)
autocmd FileType make setlocal noexpandtab tabstop=4 shiftwidth=4
" Markdown
autocmd FileType markdown setlocal wrap linebreak nolist spell
" Git commit
autocmd FileType gitcommit setlocal spell textwidth=72 colorcolumn=72
" ============================================================
" 20. FUNÇÕES AUXILIARES {{{1
" ============================================================
" Função para alternar entre número absoluto e relativo
function! ToggleNumber()
if &relativenumber
set norelativenumber
set number
else
set relativenumber
endif
endfunction
nnoremap <leader>rn :call ToggleNumber()<CR>
" Função para mostrar highlights sob o cursor
function! SynStack()
if !exists("*synstack")
return
endif
echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
endfunction
nnoremap <leader>h :call SynStack()<CR>
" ============================================================
" FIM DO ARQUIVO {{{1
" ============================================================
" vim: foldmethod=marker foldlevel=0