# Vim 빠른 참조

*모드, 내비게이션, 편집, 검색, 매크로, 버퍼*

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

## 모드

### 모드 전환

| Command | Description |
|---------|-------------|
| `i` | 삽입 모드 (커서 앞) |
| `a` | 삽입 모드 (커서 뒤) |
| `o` | 아래에 줄 삽입 후 삽입 모드 |
| `O` | 위에 줄 삽입 후 삽입 모드 |
| `v` | 비주얼 모드 (문자) |
| `V` | 비주얼 모드 (줄) |
| `Ctrl+v` | 블록 비주얼 모드 |
| `:` | 명령줄 모드 |
| `R` | 교체 모드 |
| `Esc` | 일반 모드로 돌아가기 |

## 내비게이션

### 문자 및 줄 이동

| Command | Description |
|---------|-------------|
| `h j k l` | 왼쪽, 아래, 위, 오른쪽 |
| `0 / ^` | 줄의 시작 / 첫 번째 비공백 |
| `$` | 줄의 끝 |
| `w / W` | 다음 단어 / WORD |
| `b / B` | 이전 단어 / WORD |
| `e / E` | 단어 / WORD의 끝 |
| `f{c} / F{c}` | 문자를 앞 / 뒤로 찾기 |
| `t{c} / T{c}` | 문자 직전/직후까지 앞 / 뒤로 이동 |

### 화면 및 파일 이동

| Command | Description |
|---------|-------------|
| `gg / G` | 첫 번째 / 마지막 줄로 |
| `:{n}` | n번째 줄로 |
| `Ctrl+d / Ctrl+u` | 반 페이지 아래 / 위 |
| `Ctrl+f / Ctrl+b` | 전체 페이지 아래 / 위 |
| `H / M / L` | 화면의 위 / 중간 / 아래 |
| `%` | 대응하는 괄호로 이동 |

## 편집

### 삽입 및 추가

| Command | Description |
|---------|-------------|
| `I` | 줄의 시작에 삽입 |
| `A` | 줄의 끝에 추가 |
| `ea` | 단어 끝에 추가 |
| `gi` | 마지막 삽입 위치에 삽입 |

### 삭제 및 변경

| Command | Description |
|---------|-------------|
| `x / X` | 커서 아래 / 앞의 문자 삭제 |
| `dd` | 줄 삭제 |
| `dw` | 단어 삭제 |
| `d$ / D` | 줄 끝까지 삭제 |
| `cc / S` | 줄 전체 변경 |
| `cw` | 단어 변경 |
| `c$ / C` | 줄 끝까지 변경 |
| `ci" / ci(` | 따옴표 / 괄호 안 변경 |

### 복사 및 붙여넣기

| Command | Description |
|---------|-------------|
| `yy` | 줄 얀크 (복사) |
| `yw` | 단어 얀크 |
| `y$` | 줄 끝까지 얀크 |
| `p / P` | 커서 뒤 / 앞에 붙여넣기 |
| `J` | 아래 줄을 현재 줄에 결합 |

### 되돌리기 및 반복

| Command | Description |
|---------|-------------|
| `u` | 실행 취소 |
| `Ctrl+r` | 다시 실행 |
| `.` | 마지막 명령 반복 |

## 검색 및 치환

### 검색

| Command | Description |
|---------|-------------|
| `/pattern` | 앞으로 검색 |
| `?pattern` | 뒤로 검색 |
| `n / N` | 다음 / 이전 일치 |
| `*` | 커서 아래 단어 앞으로 검색 |
| `#` | 커서 아래 단어 뒤로 검색 |

### 치환

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

## 비주얼 모드

### 선택

| Command | Description |
|---------|-------------|
| `v` | 문자 선택 시작 |
| `V` | 줄 선택 시작 |
| `Ctrl+v` | 블록 선택 시작 |
| `o` | 선택 반대편 끝으로 이동 |
| `gv` | 마지막 비주얼 선택 재선택 |

### 선택에 대한 동작

| Command | Description |
|---------|-------------|
| `d` | 선택 삭제 |
| `y` | 선택 얀크 |
| `c` | 선택 변경 |
| `>` | 선택 들여쓰기 |
| `<` | 선택 내어쓰기 |
| `~` | 대소문자 전환 |
| `U / u` | 선택을 대문자 / 소문자로 |

## 버퍼 및 윈도우

### 버퍼

| Command | Description |
|---------|-------------|
| `:ls` | 열린 버퍼 목록 |
| `:bn / :bp` | 다음 / 이전 버퍼 |
| `:b{n}` | 버퍼 n으로 이동 |
| `:bd` | 현재 버퍼 닫기 |
| `:e file` | 새 버퍼에서 파일 열기 |

### 윈도우

| Command | Description |
|---------|-------------|
| `:sp file` | 수평 분할 |
| `:vsp file` | 수직 분할 |
| `Ctrl+w h/j/k/l` | 윈도우로 이동 |
| `Ctrl+w =` | 윈도우 크기 균등화 |
| `Ctrl+w q` | 윈도우 닫기 |

### 탭

| Command | Description |
|---------|-------------|
| `:tabnew file` | 새 탭에서 파일 열기 |
| `gt / gT` | 다음 / 이전 탭 |
| `:tabclose` | 현재 탭 닫기 |

## 레지스터

### 레지스터 사용

| Command | Description |
|---------|-------------|
| `"ay` | 레지스터 a에 얀크 |
| `"ap` | 레지스터 a에서 붙여넣기 |
| `"Ay` | 레지스터 a에 얀크 추가 |
| `:reg` | 모든 레지스터 표시 |

### 특수 레지스터

| Command | Description |
|---------|-------------|
| `""` | 이름 없음 (마지막 삭제/얀크) |
| `"0` | 마지막 얀크 |
| `"+` | 시스템 클립보드 |
| `"/"` | 마지막 검색 패턴 |
| `".` | 마지막 삽입 텍스트 |
| `"_` | 블랙홀 (버림) |

## 매크로

### 기록 및 재생

| Command | Description |
|---------|-------------|
| `q{a}` | 레지스터 a에 매크로 기록 시작 |
| `q` | 기록 중지 |
| `@{a}` | 레지스터 a의 매크로 재생 |
| `@@` | 마지막 매크로 재실행 |
| `5@a` | 매크로 a를 5번 재생 |

### 매크로 예제

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

## 설정

### 일반 옵션

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

### 표시 및 동작

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

## 파일 작업

### 저장 및 종료

| Command | Description |
|---------|-------------|
| `:w` | 저장 |
| `:w file` | 다른 이름으로 저장 |
| `:q` | 종료 (저장 안 됐으면 실패) |
| `:q!` | 저장 없이 종료 |
| `:wq / :x / ZZ` | 저장 후 종료 |
| `:wa` | 모든 버퍼 저장 |
| `:qa` | 모든 버퍼 종료 |

### 파일 정보 및 외부

| Command | Description |
|---------|-------------|
| `Ctrl+g` | 파일 정보 표시 |
| `:!cmd` | 셸 명령 실행 |
| `:r !cmd` | 명령 출력 삽입 |
| `:r file` | 파일 내용 삽입 |

## 텍스트 객체

### 내부 및 주변 객체

| Command | Description |
|---------|-------------|
| `iw / aw` | 단어 내부 / 주변 |
| `is / as` | 문장 내부 / 주변 |
| `ip / ap` | 단락 내부 / 주변 |
| `i" / a"` | 큰따옴표 내부 / 주변 |
| `i' / a'` | 작은따옴표 내부 / 주변 |
| `i( / a(` | 괄호 내부 / 주변 |
| `i{ / a{` | 중괄호 내부 / 주변 |
| `it / at` | HTML 태그 내부 / 주변 |

### 자주 쓰는 조합

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

## 마크 및 점프

### 마크

| Command | Description |
|---------|-------------|
| `m{a}` | 커서 위치에 마크 a 설정 |
| `'a` | 마크 a의 줄로 이동 |
| ``a` | 마크 a의 정확한 위치로 이동 |
| `:marks` | 모든 마크 목록 |

### 점프 목록

| Command | Description |
|---------|-------------|
| `Ctrl+o` | 이전 위치로 이동 |
| `Ctrl+i` | 다음 위치로 이동 |
| `:jumps` | 점프 목록 표시 |
| `''` | 마지막 점프 위치로 이동 |
