# Referência Rápida do Vim

*Modos, navegação, edição, busca, macros, buffers*

> Source: Vim Documentation (vimdoc.sourceforge.net) · MIT

## Modos

### Troca de Modo

| Command | Description |
|---------|-------------|
| `i` | Modo de inserção (antes do cursor) |
| `a` | Modo de inserção (após o cursor) |
| `o` | Inserir linha abaixo e entrar no modo de inserção |
| `O` | Inserir linha acima e entrar no modo de inserção |
| `v` | Modo visual (caractere) |
| `V` | Modo visual (linha) |
| `Ctrl+v` | Modo de bloco visual |
| `:` | Modo de linha de comando |
| `R` | Modo de substituição |
| `Esc` | Voltar ao modo normal |

## Navegação

### Movimento por Caractere e Linha

| Command | Description |
|---------|-------------|
| `h j k l` | Esquerda, baixo, cima, direita |
| `0 / ^` | Início da linha / primeiro não-espaço |
| `$` | Fim da linha |
| `w / W` | Próxima palavra / PALAVRA |
| `b / B` | Palavra anterior / PALAVRA |
| `e / E` | Fim da palavra / PALAVRA |
| `f{c} / F{c}` | Encontrar caractere para frente / trás |
| `t{c} / T{c}` | Até o caractere para frente / trás |

### Movimento por Tela e Arquivo

| Command | Description |
|---------|-------------|
| `gg / G` | Ir para a primeira / última linha |
| `:{n}` | Ir para a linha n |
| `Ctrl+d / Ctrl+u` | Meia página abaixo / acima |
| `Ctrl+f / Ctrl+b` | Página completa abaixo / acima |
| `H / M / L` | Topo / meio / base da tela |
| `%` | Pular para o delimitador correspondente |

## Edição

### Inserir e Acrescentar

| Command | Description |
|---------|-------------|
| `I` | Inserir no início da linha |
| `A` | Acrescentar no fim da linha |
| `ea` | Acrescentar no fim da palavra |
| `gi` | Inserir na última posição de inserção |

### Excluir e Alterar

| Command | Description |
|---------|-------------|
| `x / X` | Excluir caractere sob / antes do cursor |
| `dd` | Excluir linha |
| `dw` | Excluir palavra |
| `d$ / D` | Excluir até o fim da linha |
| `cc / S` | Alterar linha inteira |
| `cw` | Alterar palavra |
| `c$ / C` | Alterar até o fim da linha |
| `ci" / ci(` | Alterar dentro de aspas / parênteses |

### Copiar e Colar

| Command | Description |
|---------|-------------|
| `yy` | Copiar (yank) linha |
| `yw` | Copiar palavra |
| `y$` | Copiar até o fim da linha |
| `p / P` | Colar após / antes do cursor |
| `J` | Unir a linha de baixo à atual |

### Desfazer e Repetir

| Command | Description |
|---------|-------------|
| `u` | Desfazer |
| `Ctrl+r` | Refazer |
| `.` | Repetir último comando |

## Busca e Substituição

### Busca

| Command | Description |
|---------|-------------|
| `/pattern` | Buscar para frente |
| `?pattern` | Buscar para trás |
| `n / N` | Próxima / ocorrência anterior |
| `*` | Buscar palavra sob o cursor (para frente) |
| `#` | Buscar palavra sob o cursor (para trás) |

### Substituição

```
:s/old/new/       " substituir primeiro na linha
:s/old/new/g      " substituir todos na linha
:%s/old/new/g     " substituir todos no arquivo
:%s/old/new/gc    " substituir todos, confirmar cada um
```

## Modo Visual

### Seleção

| Command | Description |
|---------|-------------|
| `v` | Iniciar seleção de caractere |
| `V` | Iniciar seleção de linha |
| `Ctrl+v` | Iniciar seleção de bloco |
| `o` | Mover para o outro extremo da seleção |
| `gv` | Reselecionar última seleção visual |

### Ações na Seleção

| Command | Description |
|---------|-------------|
| `d` | Excluir seleção |
| `y` | Copiar seleção |
| `c` | Alterar seleção |
| `>` | Indentar seleção |
| `<` | Remover indentação da seleção |
| `~` | Alternar maiúsculas/minúsculas |
| `U / u` | Maiúsculas / minúsculas da seleção |

## Buffers e Janelas

### Buffers

| Command | Description |
|---------|-------------|
| `:ls` | Listar buffers abertos |
| `:bn / :bp` | Próximo / buffer anterior |
| `:b{n}` | Ir para o buffer n |
| `:bd` | Fechar buffer atual |
| `:e file` | Abrir arquivo em novo buffer |

### Janelas

| Command | Description |
|---------|-------------|
| `:sp file` | Divisão horizontal |
| `:vsp file` | Divisão vertical |
| `Ctrl+w h/j/k/l` | Navegar para janela |
| `Ctrl+w =` | Equalizar tamanhos de janela |
| `Ctrl+w q` | Fechar janela |

### Abas

| Command | Description |
|---------|-------------|
| `:tabnew file` | Abrir arquivo em nova aba |
| `gt / gT` | Próxima / aba anterior |
| `:tabclose` | Fechar aba atual |

## Registros

### Usando Registros

| Command | Description |
|---------|-------------|
| `"ay` | Copiar para o registro a |
| `"ap` | Colar do registro a |
| `"Ay` | Acrescentar cópia ao registro a |
| `:reg` | Mostrar todos os registros |

### Registros Especiais

| Command | Description |
|---------|-------------|
| `""` | Sem nome (último excluído/copiado) |
| `"0` | Última cópia |
| `"+` | Área de transferência do sistema |
| `"/"` | Último padrão de busca |
| `".` | Último texto inserido |
| `"_` | Buraco negro (descartar) |

## Macros

### Gravar e Reproduzir

| Command | Description |
|---------|-------------|
| `q{a}` | Iniciar gravação de macro no registro a |
| `q` | Parar gravação |
| `@{a}` | Reproduzir macro do registro a |
| `@@` | Repetir última macro |
| `5@a` | Reproduzir macro a 5 vezes |

### Exemplo de Macro

```
qa        " iniciar gravação em a
I//       " inserir // no início da linha
Esc j     " voltar ao normal, descer
q         " parar gravação
10@a      " comentar as próximas 10 linhas
```

## Configurações

### Opções Comuns

```
:set number         " mostrar números de linha
:set relativenumber  " números de linha relativos
:set tabstop=4      " largura do tab
:set expandtab      " espaços em vez de tabs
:set ignorecase     " busca sem distinção de maiúsculas
```

### Exibição e Comportamento

```
:set wrap / nowrap   " alternar quebra de linha
:set hlsearch        " realçar correspondências de busca
:set incsearch       " busca incremental
:set cursorline      " realçar linha atual
:syntax on           " ativar realce de sintaxe
```

## Operações de Arquivo

### Salvar e Sair

| Command | Description |
|---------|-------------|
| `:w` | Salvar |
| `:w file` | Salvar como arquivo |
| `:q` | Sair (falha se não salvo) |
| `:q!` | Sair sem salvar |
| `:wq / :x / ZZ` | Salvar e sair |
| `:wa` | Salvar todos os buffers |
| `:qa` | Sair de todos os buffers |

### Informações do Arquivo e Externo

| Command | Description |
|---------|-------------|
| `Ctrl+g` | Mostrar informações do arquivo |
| `:!cmd` | Executar comando do shell |
| `:r !cmd` | Inserir saída do comando |
| `:r file` | Inserir conteúdo do arquivo |

## Objetos de Texto

### Objetos Internos e ao Redor

| Command | Description |
|---------|-------------|
| `iw / aw` | Dentro / ao redor da palavra |
| `is / as` | Dentro / ao redor da sentença |
| `ip / ap` | Dentro / ao redor do parágrafo |
| `i" / a"` | Dentro / ao redor de aspas duplas |
| `i' / a'` | Dentro / ao redor de aspas simples |
| `i( / a(` | Dentro / ao redor de parênteses |
| `i{ / a{` | Dentro / ao redor de chaves |
| `it / at` | Dentro / ao redor de tag HTML |

### Combinações Comuns

```
ciw     " alterar palavra interna
di"     " excluir dentro de aspas
ya{     " copiar ao redor de chaves
vip     " selecionar parágrafo interno
```

## Marcas e Saltos

### Marcas

| Command | Description |
|---------|-------------|
| `m{a}` | Definir marca a na posição do cursor |
| `'a` | Saltar para a linha da marca a |
| ``a` | Saltar para a posição exata da marca a |
| `:marks` | Listar todas as marcas |

### Lista de Saltos

| Command | Description |
|---------|-------------|
| `Ctrl+o` | Saltar para posição anterior |
| `Ctrl+i` | Saltar para próxima posição |
| `:jumps` | Mostrar lista de saltos |
| `''` | Saltar para a última posição de salto |
