# Vim Tham Khảo Nhanh

*Chế độ, điều hướng, chỉnh sửa, tìm kiếm, macro, buffer*

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

## Chế Độ

### Chuyển Đổi Chế Độ

| Command | Description |
|---------|-------------|
| `i` | Chế độ Insert (trước con trỏ) |
| `a` | Chế độ Insert (sau con trỏ) |
| `o` | Chèn dòng phía dưới và vào chế độ Insert |
| `O` | Chèn dòng phía trên và vào chế độ Insert |
| `v` | Chế độ Visual (ký tự) |
| `V` | Chế độ Visual (dòng) |
| `Ctrl+v` | Chế độ Visual block |
| `:` | Chế độ dòng lệnh |
| `R` | Chế độ Replace |
| `Esc` | Quay về chế độ Normal |

## Điều Hướng

### Di Chuyển Ký Tự & Dòng

| Command | Description |
|---------|-------------|
| `h j k l` | Trái, xuống, lên, phải |
| `0 / ^` | Đầu dòng / ký tự đầu không phải khoảng trắng |
| `$` | Cuối dòng |
| `w / W` | Từ tiếp theo / WORD tiếp theo |
| `b / B` | Từ trước / WORD trước |
| `e / E` | Cuối từ / WORD |
| `f{c} / F{c}` | Tìm ký tự tiến / lùi |
| `t{c} / T{c}` | Đến trước ký tự tiến / lùi |

### Di Chuyển Màn Hình & File

| Command | Description |
|---------|-------------|
| `gg / G` | Đến dòng đầu / cuối |
| `:{n}` | Đến dòng n |
| `Ctrl+d / Ctrl+u` | Cuộn nửa trang xuống / lên |
| `Ctrl+f / Ctrl+b` | Cuộn một trang xuống / lên |
| `H / M / L` | Đầu / giữa / cuối màn hình |
| `%` | Nhảy đến dấu ngoặc tương ứng |

## Chỉnh Sửa

### Insert & Append

| Command | Description |
|---------|-------------|
| `I` | Insert ở đầu dòng |
| `A` | Append ở cuối dòng |
| `ea` | Append ở cuối từ |
| `gi` | Insert tại vị trí insert cuối |

### Xóa & Thay Đổi

| Command | Description |
|---------|-------------|
| `x / X` | Xóa ký tự tại / trước con trỏ |
| `dd` | Xóa dòng |
| `dw` | Xóa từ |
| `d$ / D` | Xóa đến cuối dòng |
| `cc / S` | Thay toàn bộ dòng |
| `cw` | Thay từ |
| `c$ / C` | Thay đến cuối dòng |
| `ci" / ci(` | Thay bên trong dấu nháy / ngoặc |

### Sao Chép & Dán

| Command | Description |
|---------|-------------|
| `yy` | Yank (sao chép) dòng |
| `yw` | Yank từ |
| `y$` | Yank đến cuối dòng |
| `p / P` | Dán sau / trước con trỏ |
| `J` | Nối dòng phía dưới vào dòng hiện tại |

### Undo & Lặp Lại

| Command | Description |
|---------|-------------|
| `u` | Undo |
| `Ctrl+r` | Redo |
| `.` | Lặp lại lệnh cuối |

## Tìm Kiếm & Thay Thế

### Tìm Kiếm

| Command | Description |
|---------|-------------|
| `/pattern` | Tìm kiếm tiến |
| `?pattern` | Tìm kiếm lùi |
| `n / N` | Kết quả tiếp / trước |
| `*` | Tìm từ tại con trỏ (tiến) |
| `#` | Tìm từ tại con trỏ (lùi) |

### Thay Thế

```
: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
```

## Chế Độ Visual

### Chọn Vùng

| Command | Description |
|---------|-------------|
| `v` | Bắt đầu chọn ký tự |
| `V` | Bắt đầu chọn dòng |
| `Ctrl+v` | Bắt đầu chọn block |
| `o` | Di chuyển đến đầu kia vùng chọn |
| `gv` | Chọn lại vùng visual cuối |

### Hành Động Trên Vùng Chọn

| Command | Description |
|---------|-------------|
| `d` | Xóa vùng chọn |
| `y` | Yank vùng chọn |
| `c` | Thay vùng chọn |
| `>` | Thụt lề vùng chọn |
| `<` | Bỏ thụt lề vùng chọn |
| `~` | Đổi hoa/thường |
| `U / u` | Chữ hoa / chữ thường vùng chọn |

## Buffer & Cửa Sổ

### Buffer

| Command | Description |
|---------|-------------|
| `:ls` | Liệt kê buffer đang mở |
| `:bn / :bp` | Buffer tiếp / trước |
| `:b{n}` | Đến buffer n |
| `:bd` | Đóng buffer hiện tại |
| `:e file` | Mở file trong buffer mới |

### Cửa Sổ

| Command | Description |
|---------|-------------|
| `:sp file` | Chia ngang |
| `:vsp file` | Chia dọc |
| `Ctrl+w h/j/k/l` | Điều hướng đến cửa sổ |
| `Ctrl+w =` | Cân bằng kích thước cửa sổ |
| `Ctrl+w q` | Đóng cửa sổ |

### Tab

| Command | Description |
|---------|-------------|
| `:tabnew file` | Mở file trong tab mới |
| `gt / gT` | Tab tiếp / trước |
| `:tabclose` | Đóng tab hiện tại |

## Register

### Sử Dụng Register

| Command | Description |
|---------|-------------|
| `"ay` | Yank vào register a |
| `"ap` | Dán từ register a |
| `"Ay` | Nối yank vào register a |
| `:reg` | Hiển thị tất cả register |

### Register Đặc Biệt

| Command | Description |
|---------|-------------|
| `""` | Không tên (xóa/yank cuối) |
| `"0` | Yank cuối |
| `"+` | Clipboard hệ thống |
| `"/"` | Pattern tìm kiếm cuối |
| `".` | Văn bản insert cuối |
| `"_` | Hố đen (bỏ qua) |

## Macro

### Ghi & Phát

| Command | Description |
|---------|-------------|
| `q{a}` | Bắt đầu ghi macro vào register a |
| `q` | Dừng ghi |
| `@{a}` | Phát macro từ register a |
| `@@` | Phát lại macro cuối |
| `5@a` | Phát macro a 5 lần |

### Ví Dụ 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
```

## Cài Đặt

### Tùy Chọn Phổ Biến

```
: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
```

### Hiển Thị & Hành Vi

```
: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
```

## Thao Tác File

### Lưu & Thoát

| Command | Description |
|---------|-------------|
| `:w` | Lưu |
| `:w file` | Lưu thành file |
| `:q` | Thoát (thất bại nếu chưa lưu) |
| `:q!` | Thoát không lưu |
| `:wq / :x / ZZ` | Lưu và thoát |
| `:wa` | Lưu tất cả buffer |
| `:qa` | Thoát tất cả buffer |

### Thông Tin File & External

| Command | Description |
|---------|-------------|
| `Ctrl+g` | Hiển thị thông tin file |
| `:!cmd` | Chạy lệnh shell |
| `:r !cmd` | Chèn output lệnh |
| `:r file` | Chèn nội dung file |

## Text Object

### Inner & Around Object

| Command | Description |
|---------|-------------|
| `iw / aw` | Bên trong / bao quanh từ |
| `is / as` | Bên trong / bao quanh câu |
| `ip / ap` | Bên trong / bao quanh đoạn |
| `i" / a"` | Bên trong / bao quanh dấu nháy kép |
| `i' / a'` | Bên trong / bao quanh dấu nháy đơn |
| `i( / a(` | Bên trong / bao quanh ngoặc đơn |
| `i{ / a{` | Bên trong / bao quanh ngoặc nhọn |
| `it / at` | Bên trong / bao quanh thẻ HTML |

### Kết Hợp Phổ Biến

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

## Mark & Jump

### Mark

| Command | Description |
|---------|-------------|
| `m{a}` | Đặt mark a tại vị trí con trỏ |
| `'a` | Nhảy đến dòng của mark a |
| ``a` | Nhảy đến vị trí chính xác của mark a |
| `:marks` | Liệt kê tất cả mark |

### Jump List

| Command | Description |
|---------|-------------|
| `Ctrl+o` | Nhảy về vị trí trước |
| `Ctrl+i` | Nhảy đến vị trí tiếp |
| `:jumps` | Hiển thị jump list |
| `''` | Nhảy đến vị trí jump cuối |
