Guides
Fundamentos ▾
Versionamento ▾
Deploy ▾

Vim / Neovim

Editor modal. O que as teclas fazem depende do modo ativo. Velocidade vem de combinar operadores + movimentos + text objects.

Modos

NORMAL
navegar, deletar, copiar, executar comandos — modo padrão
EscCtrl+[
INSERT
digitar texto
iaoOIA
VISUAL
selecionar texto
vVCtrl+v
COMMAND
:wq :s/... :set
:
REPLACE
sobrescrever texto
R
TeclaEntra em
i / aInsert antes / após cursor
I / AInsert no início / fim da linha
o / ONova linha abaixo / acima + Insert
v / V / Ctrl+vVisual char / linha / bloco
RReplace mode
:Command mode
Esc / Ctrl+[Voltar para Normal

Movimentação Básica

Básico
h
j
k
l
0início da linha
^1º char não-branco
$fim da linha
ggprimeira linha
Gúltima linha
42Glinha 42

Movimentação por Palavras

TeclaMovimento
wpróximo início de palavra
Wpróximo início de WORD (espaço-delimitada)
binício da palavra anterior
Binício da WORD anterior
efim da palavra atual/próxima
Efim da WORD atual/próxima
gefim da palavra anterior
palavra = letras/números/underscore. WORD = qualquer sequência sem espaço (inclui pontuação).

Saltos — f/t/F/T

Saltos na linha
f{x}para o próximo x
F{x}para o x anterior
t{x}antes do próximo x
T{x}após o x anterior
;repetir (mesmo sentido)
,repetir (sentido oposto)
%par de () {} []
*buscar palavra (frente)
#buscar palavra (trás)

Tela e Scroll

Ctrl+d
descer meia página
Ctrl+u
subir meia página
Ctrl+f
descer página inteira
Ctrl+b
subir página inteira
zt
cursor no topo da tela
zz
cursor no centro
zb
cursor na base
H / M / L
mover cursor topo/meio/base da tela

Marcadores

ma      " criar marcador 'a' na posição atual
`a      " ir para posição exata do marcador 'a'
'a      " ir para a linha do marcador 'a'
``      " voltar à posição antes do último salto
`.      " ir para a última edição

Operadores

Combinam com movimentos e text objects: {operador}{movimento}

OperadorAçãoExemplo
ddeletard3w = deletar 3 palavras
ycopiar (yank)yip = copiar parágrafo
cmudar (del + Insert)cw = mudar palavra
>indentar direita>i{ = indentar bloco {}
<indentar esquerda<< = desindentar linha
=auto-indentar=ip = indentar parágrafo
gUmaiúsculasgUaw = palavra em maiúscula
guminúsculasguip = parágrafo em minúscula
g~inverter capitalizaçãog~w = inverter palavra

Text Objects

const name = "alfredo"
function foo(a, b) { ... }
i = inner (sem delimitador)
a = around (com delimitador)
ObjetoAlvoExemplo (com c)
w / Wpalavra / WORDciw = mudar palavra
ssentençadas = deletar sentença
pparágrafoyap = copiar parágrafo
" ' `aspas (tipo)ci" = mudar conteúdo das aspas
( ) ou bparêntesesca( = mudar com parênteses
{ } ou Bchavesdi{ = deletar corpo {}
[ ]colchetesci[ = mudar conteúdo []
ttag HTML/XMLcit = mudar conteúdo de tag

Edição — Normal Mode

x       " deletar caractere sob cursor
r{x}    " substituir caractere por x
dd      " deletar linha
D       " deletar do cursor até fim da linha
cc      " mudar linha inteira (= ddO)
C       " mudar do cursor até fim
yy      " copiar linha
p / P   " colar depois / antes

u       " desfazer
Ctrl+r  " refazer
.       " repetir último comando (poderoso!)

>>      " indentar linha
<<      " desindentar linha
==      " auto-indentar linha

Registradores

RegistradorFunção
"a .. "znomeados — uso manual
"+clipboard do sistema (X11/Wayland)
"*seleção do mouse (X11)
"_black hole — deletar sem salvar
"/último padrão de busca
"0último yank
"1 .. "9histórico de deletes
"ayy       " copiar linha para registrador a
"ap        " colar do registrador a
"+y        " copiar para clipboard do sistema
"+p        " colar do clipboard
"_d        " deletar sem contaminar o clipboard
:reg       " ver todos os registradores

Macros

q{a}       " iniciar gravação no registrador a
           " executar as ações...
q          " parar gravação

@{a}       " executar macro a
@@         " repetir última macro
10@a       " executar macro a 10 vezes

:g/pattern/normal @a   " executar macro em todas as linhas com padrão
Macros são texto armazenado em registradores. :reg a mostra o conteúdo. Pode editar e colar em outro registrador.

Busca

/padrão    " buscar para frente
?padrão    " buscar para trás
n / N      " próxima / anterior ocorrência
*          " buscar palavra sob cursor (frente)
#          " buscar palavra sob cursor (trás)

:noh       " limpar highlight
:set hlsearch      " habilitar highlight
:set incsearch     " busca incremental

Substituição

:s/padrão/substituição/       " linha atual (primeira)
:s/padrão/substituição/g      " linha atual (todas)
:%s/padrão/substituição/g     " todo arquivo
:%s/padrão/substituição/gc    " com confirmação (y/n/a/q/l)
:10,20s/foo/bar/g             " linhas 10-20
:'<,'>s/foo/bar/g             " na seleção visual

" flags: g=all  c=confirm  i=case-insensitive  e=no-error

:%s/\/bar/g             " palavra exata
:%s/\s\+$//e                  " remover whitespace no fim
:%s/\(func\) \(\w\+\)/\2 = \1/g  " captura de grupo

Buffers

:e arquivo.txt    " abrir arquivo
:ls               " listar buffers abertos
:bn / :bp         " próximo / anterior
:bd               " fechar buffer atual
:b N              " ir para buffer N
:b nome           " ir por nome (Tab completa)

Janelas (Splits)

:sp arquivo      " dividir horizontal
:vsp arquivo     " dividir vertical
Ctrl+w s / v     " split h / v
Ctrl+w q         " fechar janela atual
Ctrl+w o         " fechar todas exceto a atual
Ctrl+w h/j/k/l   " navegar entre janelas
Ctrl+w H/J/K/L   " mover janela para direção
Ctrl+w =         " equalizar tamanhos
Ctrl+w +/-       " aumentar / diminuir altura
Ctrl+w > / <     " aumentar / diminuir largura

Abas

:tabnew arquivo   " nova aba
gt / gT           " próxima / anterior
Ngt               " ir para aba N
:tabclose         " fechar aba atual
:tabonly          " fechar todas exceto a atual

Visual Mode

v       " selecionar por caractere
V       " selecionar por linha
Ctrl+v  " selecionar por bloco (coluna)

" após selecionar:
d / y / c          " deletar / copiar / mudar
> / <              " indentar / desindentar
u / U              " minúsculas / maiúsculas
~                  " inverter capitalização
:                  " executar comando no range

" edição em bloco (Ctrl+v):
Ctrl+v → selecionar colunas → I → texto → Esc
" insere em todas as linhas da seleção

Insert Mode

Ctrl+n/p
autocomplete próximo/anterior
Ctrl+x Ctrl+f
completar nomes de arquivo
Ctrl+r {reg}
inserir conteúdo do registrador
Ctrl+o
executar 1 comando Normal e voltar
Ctrl+w
deletar palavra anterior
Ctrl+u
deletar linha atual
Ctrl+t / Ctrl+d
indentar / desindentar linha

Command Mode (:)

:w :q :wq :q! :qa!     " salvar / sair
ZZ / ZQ                " Normal: salvar+sair / sair sem salvar

:!cmd                  " executar shell
:r !cmd                " inserir output no buffer
:w !sudo tee %         " salvar como root

:set number / rnu      " números de linha / relativos
:set wrap / nowrap
:set tabstop=2 shiftwidth=2 expandtab

:g/pattern/d           " deletar linhas com padrão
:g/pattern/normal @a   " executar macro nas linhas
:'<,'>sort             " ordenar seleção

:help palavra          " ajuda
:checkhealth           " diagnóstico (Neovim)
:Mason                 " gerenciar servidores LSP
:Lazy                  " gerenciar plugins

~/.vimrc

set number relativenumber
set tabstop=2 shiftwidth=2 expandtab
set ignorecase smartcase
set hlsearch incsearch
set scrolloff=8
set signcolumn=yes
set updatetime=300

let mapleader = " "

nnoremap w :w
nnoremap q :q
nnoremap  h
nnoremap  j
nnoremap  k
nnoremap  l

" manter seleção ao indentar
vnoremap <  >gv

" limpar highlight
nnoremap  :noh

" mover linhas
nnoremap  :m .+1==
nnoremap  :m .-2==
vnoremap  :m '>+1gv=gv
vnoremap  :m '<-2gv=gv

Neovim — init.lua

-- ~/.config/nvim/init.lua
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.tabstop = 2
vim.opt.shiftwidth = 2
vim.opt.expandtab = true
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.opt.hlsearch = true
vim.opt.scrolloff = 8
vim.opt.signcolumn = "yes"
vim.opt.updatetime = 300

vim.g.mapleader = " "

local map = vim.keymap.set
map("n", "w", ":w")
map("n", "q", ":q")
map("n", "", "h")
map("n", "", "j")
map("n", "", "k")
map("n", "", "l")
map("v", "<", "", ">gv")
map("n", "", ":noh")

LSP (Neovim)

-- keymaps LSP (no on_attach)
map("n", "gd", vim.lsp.buf.definition)
map("n", "gr", vim.lsp.buf.references)
map("n", "K",  vim.lsp.buf.hover)
map("n", "rn", vim.lsp.buf.rename)
map("n", "ca", vim.lsp.buf.code_action)
map("n", "[d", vim.diagnostic.goto_prev)
map("n", "]d", vim.diagnostic.goto_next)
map("n", "e", vim.diagnostic.open_float)
AtalhoAção LSP
gdir para definição
grver referências
Khover / documentação
<leader>rnrenomear símbolo
<leader>cacode actions
[d / ]ddiagnóstico anterior / próximo

Plugins Essenciais (lazy.nvim)

{ "nvim-telescope/telescope.nvim" }   -- busca fuzzy
{ "nvim-tree/nvim-tree.lua" }          -- árvore de arquivos
{ "nvim-treesitter/nvim-treesitter" }  -- syntax highlighting
{ "neovim/nvim-lspconfig" }            -- LSP
{ "williamboman/mason.nvim" }          -- instalar servidores LSP
{ "hrsh7th/nvim-cmp" }                 -- autocomplete
{ "lewis6991/gitsigns.nvim" }          -- git na margem
{ "NeogitOrg/neogit" }                 -- git visual
{ "stevearc/conform.nvim" }            -- formatação

Dicas de Produtividade

" dot command — repetir a mudança em vários lugares:
ciw novo-nome    " mudar palavra
n .                   " próxima ocorrência + repetir
n . n . n .           " continuar...

" edição em bloco — adicionar em múltiplas linhas:
Ctrl+v → j j j → I → texto → Esc

" copiar caminho do arquivo:
:let @+ = expand('%:p')

" remover whitespace no fim:
:%s/\s\+$//e

" converter tabs em espaços:
:retab

" folds:
zc / zo / za    " fechar / abrir / toggle
zR / zM         " abrir todos / fechar todos

" terminal (Neovim):
:term
Ctrl+\ Ctrl+n   " voltar para Normal mode

Referência Rápida

TarefaComandoNotas
Salvar:w ou ZZZZ também sai
Sair sem salvar:q! ou ZQ
Desfazer / refazeru / Ctrl+rmúltiplas vezes
Repetir comando.o mais útil do Vim
Mudar palavraciwc = mudar + insert
Mudar stringci"funciona com ' ` ( {
Copiar linhayyY = mesmo
Deletar até fimD= d$
Ir para linha NNgg ou :Nex: 42gg
Buscar palavra* / #frente / trás
Substituir tudo:%s/a/b/gcc = confirmar
Clipboard sistema"+y / "+pregistrador +
Gravar macroqa ... q@a executa
Split verticalCtrl+w v:vsp arquivo
Navegar splitsCtrl+w hjkl
Fechar splitCtrl+w q
Meia páginaCtrl+d / Ctrl+umais usado que PgDn
Centralizar cursorzzzt = topo, zb = base