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
| Tecla | Entra em |
|---|---|
| i / a | Insert antes / após cursor |
| I / A | Insert no início / fim da linha |
| o / O | Nova linha abaixo / acima + Insert |
| v / V / Ctrl+v | Visual char / linha / bloco |
| R | Replace mode |
| : | Command mode |
| Esc / Ctrl+[ | Voltar para Normal |
Movimentação Básica
Básico
h→←
j→↓
k→↑
l→→
0→início da linha
^→1º char não-branco
$→fim da linha
gg→primeira linha
G→última linha
42G→linha 42
Movimentação por Palavras
| Tecla | Movimento |
|---|---|
| w | próximo início de palavra |
| W | próximo início de WORD (espaço-delimitada) |
| b | início da palavra anterior |
| B | início da WORD anterior |
| e | fim da palavra atual/próxima |
| E | fim da WORD atual/próxima |
| ge | fim 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}
| Operador | Ação | Exemplo |
|---|---|---|
| d | deletar | d3w = deletar 3 palavras |
| y | copiar (yank) | yip = copiar parágrafo |
| c | mudar (del + Insert) | cw = mudar palavra |
| > | indentar direita | >i{ = indentar bloco {} |
| < | indentar esquerda | << = desindentar linha |
| = | auto-indentar | =ip = indentar parágrafo |
| gU | maiúsculas | gUaw = palavra em maiúscula |
| gu | minúsculas | guip = parágrafo em minúscula |
| g~ | inverter capitalização | g~w = inverter palavra |
Text Objects
const name = "alfredo"
function foo(a, b) { ... }
i = inner (sem delimitador)a = around (com delimitador)| Objeto | Alvo | Exemplo (com c) |
|---|---|---|
| w / W | palavra / WORD | ciw = mudar palavra |
| s | sentença | das = deletar sentença |
| p | parágrafo | yap = copiar parágrafo |
| " ' ` | aspas (tipo) | ci" = mudar conteúdo das aspas |
| ( ) ou b | parênteses | ca( = mudar com parênteses |
| { } ou B | chaves | di{ = deletar corpo {} |
| [ ] | colchetes | ci[ = mudar conteúdo [] |
| t | tag HTML/XML | cit = 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
| Registrador | Função |
|---|---|
| "a .. "z | nomeados — 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 .. "9 | histó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)
| Atalho | Ação LSP |
|---|---|
| gd | ir para definição |
| gr | ver referências |
| K | hover / documentação |
| <leader>rn | renomear símbolo |
| <leader>ca | code actions |
| [d / ]d | diagnó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
| Tarefa | Comando | Notas |
|---|---|---|
| Salvar | :w ou ZZ | ZZ também sai |
| Sair sem salvar | :q! ou ZQ | |
| Desfazer / refazer | u / Ctrl+r | múltiplas vezes |
| Repetir comando | . | o mais útil do Vim |
| Mudar palavra | ciw | c = mudar + insert |
| Mudar string | ci" | funciona com ' ` ( { |
| Copiar linha | yy | Y = mesmo |
| Deletar até fim | D | = d$ |
| Ir para linha N | Ngg ou :N | ex: 42gg |
| Buscar palavra | * / # | frente / trás |
| Substituir tudo | :%s/a/b/gc | c = confirmar |
| Clipboard sistema | "+y / "+p | registrador + |
| Gravar macro | qa ... q | @a executa |
| Split vertical | Ctrl+w v | :vsp arquivo |
| Navegar splits | Ctrl+w hjkl | |
| Fechar split | Ctrl+w q | |
| Meia página | Ctrl+d / Ctrl+u | mais usado que PgDn |
| Centralizar cursor | zz | zt = topo, zb = base |