# Riferimento Rapido Vim

*Modalità, navigazione, editing, ricerca, macro, buffer*

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

## Modalità

### Cambio Modalità

| Command | Description |
|---------|-------------|
| `i` | Modalità insert (prima del cursore) |
| `a` | Modalità insert (dopo il cursore) |
| `o` | Inserisce riga sotto ed entra in insert |
| `O` | Inserisce riga sopra ed entra in insert |
| `v` | Modalità visual (carattere) |
| `V` | Modalità visual (riga) |
| `Ctrl+v` | Modalità visual block |
| `:` | Modalità command-line |
| `R` | Modalità replace |
| `Esc` | Torna alla modalità normale |

## Navigazione

### Movimento Carattere e Riga

| Command | Description |
|---------|-------------|
| `h j k l` | Sinistra, giù, su, destra |
| `0 / ^` | Inizio riga / primo carattere non blank |
| `$` | Fine riga |
| `w / W` | Parola successiva / PAROLA |
| `b / B` | Parola precedente / PAROLA |
| `e / E` | Fine parola / PAROLA |
| `f{c} / F{c}` | Trova carattere in avanti / indietro |
| `t{c} / T{c}` | Fino a carattere in avanti / indietro |

### Movimento Schermo e File

| Command | Description |
|---------|-------------|
| `gg / G` | Vai alla prima / ultima riga |
| `:{n}` | Vai alla riga n |
| `Ctrl+d / Ctrl+u` | Metà pagina giù / su |
| `Ctrl+f / Ctrl+b` | Pagina intera giù / su |
| `H / M / L` | Alto / centro / basso dello schermo |
| `%` | Salta alla parentesi corrispondente |

## Editing

### Insert e Append

| Command | Description |
|---------|-------------|
| `I` | Insert all'inizio della riga |
| `A` | Append alla fine della riga |
| `ea` | Append alla fine della parola |
| `gi` | Insert all'ultima posizione di insert |

### Elimina e Cambia

| Command | Description |
|---------|-------------|
| `x / X` | Elimina carattere sotto / prima del cursore |
| `dd` | Elimina riga |
| `dw` | Elimina parola |
| `d$ / D` | Elimina fino a fine riga |
| `cc / S` | Cambia intera riga |
| `cw` | Cambia parola |
| `c$ / C` | Cambia fino a fine riga |
| `ci" / ci(` | Cambia dentro virgolette / parentesi |

### Copia e Incolla

| Command | Description |
|---------|-------------|
| `yy` | Copia (yank) riga |
| `yw` | Copia parola |
| `y$` | Copia fino a fine riga |
| `p / P` | Incolla dopo / prima del cursore |
| `J` | Unisce riga sotto alla corrente |

### Annulla e Ripeti

| Command | Description |
|---------|-------------|
| `u` | Annulla |
| `Ctrl+r` | Ripristina |
| `.` | Ripete l'ultimo comando |

## Ricerca e Sostituzione

### Ricerca

| Command | Description |
|---------|-------------|
| `/pattern` | Cerca in avanti |
| `?pattern` | Cerca indietro |
| `n / N` | Prossima / precedente corrispondenza |
| `*` | Cerca parola sotto cursore (in avanti) |
| `#` | Cerca parola sotto cursore (indietro) |

### Sostituzione

```
:s/old/new/       " replace first on line
:s/old/new/g      " replace all on line
:%s/old/new/g     " replace all in file
:%s/old/new/gc    " replace all, confirm each
```

## Modalità Visual

### Selezione

| Command | Description |
|---------|-------------|
| `v` | Inizia selezione carattere |
| `V` | Inizia selezione riga |
| `Ctrl+v` | Inizia selezione blocco |
| `o` | Sposta all'altro estremo della selezione |
| `gv` | Ri-seleziona l'ultima selezione visual |

### Azioni sulla Selezione

| Command | Description |
|---------|-------------|
| `d` | Elimina selezione |
| `y` | Copia selezione |
| `c` | Cambia selezione |
| `>` | Indenta selezione |
| `<` | Deindenta selezione |
| `~` | Inverti maiuscolo/minuscolo |
| `U / u` | Maiuscolo / minuscolo selezione |

## Buffer e Finestre

### Buffer

| Command | Description |
|---------|-------------|
| `:ls` | Elenca buffer aperti |
| `:bn / :bp` | Buffer successivo / precedente |
| `:b{n}` | Vai al buffer n |
| `:bd` | Chiudi buffer corrente |
| `:e file` | Apri file in nuovo buffer |

### Finestre

| Command | Description |
|---------|-------------|
| `:sp file` | Split orizzontale |
| `:vsp file` | Split verticale |
| `Ctrl+w h/j/k/l` | Naviga alla finestra |
| `Ctrl+w =` | Equalizza dimensioni finestre |
| `Ctrl+w q` | Chiudi finestra |

### Tab

| Command | Description |
|---------|-------------|
| `:tabnew file` | Apri file in nuova tab |
| `gt / gT` | Tab successiva / precedente |
| `:tabclose` | Chiudi tab corrente |

## Registri

### Usare i Registri

| Command | Description |
|---------|-------------|
| `"ay` | Copia nel registro a |
| `"ap` | Incolla dal registro a |
| `"Ay` | Aggiunge copia al registro a |
| `:reg` | Mostra tutti i registri |

### Registri Speciali

| Command | Description |
|---------|-------------|
| `""` | Senza nome (ultimo delete/yank) |
| `"0` | Ultimo yank |
| `"+` | Clipboard di sistema |
| `"/"` | Ultimo pattern di ricerca |
| `".` | Ultimo testo inserito |
| `"_` | Buco nero (scarta) |

## Macro

### Registrare e Riprodurre

| Command | Description |
|---------|-------------|
| `q{a}` | Inizia registrazione macro nel registro a |
| `q` | Ferma registrazione |
| `@{a}` | Riproduci macro dal registro a |
| `@@` | Ripete l'ultima macro |
| `5@a` | Riproduci macro a 5 volte |

### Esempio Macro

```
qa        " start recording into a
I//       " insert // at line start
Esc j     " return to normal, move down
q         " stop recording
10@a      " comment next 10 lines
```

## Impostazioni

### Opzioni Comuni

```
:set number         " show line numbers
:set relativenumber  " relative line numbers
:set tabstop=4      " tab width
:set expandtab      " spaces instead of tabs
:set ignorecase     " case-insensitive search
```

### Display e Comportamento

```
:set wrap / nowrap   " toggle line wrapping
:set hlsearch        " highlight search matches
:set incsearch       " incremental search
:set cursorline      " highlight current line
:syntax on           " enable syntax highlighting
```

## Operazioni sui File

### Salva e Chiudi

| Command | Description |
|---------|-------------|
| `:w` | Salva |
| `:w file` | Salva come file |
| `:q` | Esci (fallisce se non salvato) |
| `:q!` | Esci senza salvare |
| `:wq / :x / ZZ` | Salva ed esci |
| `:wa` | Salva tutti i buffer |
| `:qa` | Chiudi tutti i buffer |

### Info File e Comandi Esterni

| Command | Description |
|---------|-------------|
| `Ctrl+g` | Mostra info file |
| `:!cmd` | Esegui comando shell |
| `:r !cmd` | Inserisce output del comando |
| `:r file` | Inserisce contenuto del file |

## Text Object

### Oggetti Inner e Around

| Command | Description |
|---------|-------------|
| `iw / aw` | Dentro / attorno alla parola |
| `is / as` | Dentro / attorno alla frase |
| `ip / ap` | Dentro / attorno al paragrafo |
| `i" / a"` | Dentro / attorno a virgolette doppie |
| `i' / a'` | Dentro / attorno a virgolette singole |
| `i( / a(` | Dentro / attorno a parentesi |
| `i{ / a{` | Dentro / attorno a graffe |
| `it / at` | Dentro / attorno a tag HTML |

### Combinazioni Comuni

```
ciw     " change inner word
di"     " delete inside quotes
ya{     " yank around braces
vip     " select inner paragraph
```

## Segni e Salti

### Segni

| Command | Description |
|---------|-------------|
| `m{a}` | Imposta segno a alla posizione cursore |
| `'a` | Salta alla riga del segno a |
| ``a` | Salta alla posizione esatta del segno a |
| `:marks` | Elenca tutti i segni |

### Lista Salti

| Command | Description |
|---------|-------------|
| `Ctrl+o` | Salta alla posizione precedente |
| `Ctrl+i` | Salta alla posizione successiva |
| `:jumps` | Mostra lista salti |
| `''` | Salta all'ultima posizione di salto |
