vi는 유닉스/리눅스 계열 시스템의 기본 텍스트 편집기로, 명령 모드(Command Mode), 입력 모드(Insert Mode), 명령행 모드(Last Line/ex Mode) 세 가지 모드로 동작합니다.
명령 모드 ──(i,a,o 등)──▶ 입력 모드
▲ │
└────────(Esc)─────────────┘
│
└──( : )──▶ 명령행 모드 ──(Enter)──▶ 명령 모드
1. 모드 전환
| 명령 | 설명 |
|---|
Esc | 어느 모드에서든 명령 모드로 돌아감 |
: | 명령행 모드로 진입 (파일 저장, 종료, 치환 등) |
2. 파일 열기 / 저장 / 종료
| 명령 | 설명 |
|---|
vi 파일명 | 지정한 파일을 열기(없으면 새로 생성) |
vi +n 파일명 | n번째 줄로 커서를 이동한 상태로 열기 |
vi + 파일명 | 파일의 마지막 줄로 이동한 상태로 열기 |
:w | 저장 |
:w 파일명 | 다른 이름으로 저장 |
:q | 종료 (변경 사항 없을 때) |
:q! | 강제 종료 (변경 사항 무시) |
:wq 또는 :x | 저장 후 종료 |
ZZ | 저장 후 종료 (명령 모드에서 바로 입력) |
3. 입력 모드 진입 명령
| 명령 | 설명 |
|---|
i | 현재 커서 앞에서 입력 시작 (insert) |
I | 현재 줄의 맨 앞에서 입력 시작 |
a | 현재 커서 뒤에서 입력 시작 (append) |
A | 현재 줄의 맨 끝에서 입력 시작 |
o | 현재 줄 아래에 새 줄을 열어 입력 시작 (open) |
O | 현재 줄 위에 새 줄을 열어 입력 시작 |
R | 덮어쓰기 모드로 입력 시작 (replace) |
4. 커서 이동
문자/줄 단위
| 명령 | 설명 |
|---|
h / ← | 왼쪽으로 한 칸 이동 |
j / ↓ | 아래로 한 줄 이동 |
k / ↑ | 위로 한 줄 이동 |
l / → | 오른쪽으로 한 칸 이동 |
0 | 현재 줄의 맨 앞으로 이동 |
^ | 현재 줄의 첫 번째 (공백 아닌) 문자로 이동 |
$ | 현재 줄의 맨 끝으로 이동 |
단어 단위
| 명령 | 설명 |
|---|
w | 다음 단어의 시작으로 이동 |
W | 다음 단어의 시작으로 이동 (구두점 무시, 공백 기준) |
b | 이전 단어의 시작으로 이동 |
B | 이전 단어의 시작으로 이동 (구두점 무시) |
e | 다음 단어의 끝으로 이동 |
E | 다음 단어의 끝으로 이동 (구두점 무시) |
화면/문서 단위
| 명령 | 설명 |
|---|
H | 화면 맨 위 줄로 이동 |
M | 화면 중간 줄로 이동 |
L | 화면 맨 아래 줄로 이동 |
Ctrl+f | 한 화면 아래로 스크롤 (page down) |
Ctrl+b | 한 화면 위로 스크롤 (page up) |
Ctrl+d | 반 화면 아래로 스크롤 |
Ctrl+u | 반 화면 위로 스크롤 |
gg | 문서 맨 처음으로 이동 |
G | 문서 맨 끝으로 이동 |
nG 또는 :n | n번째 줄로 이동 |
5. 삭제 (delete)
| 명령 | 설명 |
|---|
x | 커서 위치의 문자 삭제 |
X | 커서 앞의 문자 삭제 |
dd | 현재 줄 삭제 |
ndd | 현재 줄부터 n줄 삭제 |
dw | 커서 위치부터 단어 끝까지 삭제 |
d$ 또는 D | 커서 위치부터 줄 끝까지 삭제 |
d0 | 커서 위치부터 줄 처음까지 삭제 |
dG | 커서 위치부터 문서 끝까지 삭제 |
dgg | 커서 위치부터 문서 처음까지 삭제 |
6. 복사(yank) / 붙여넣기(put)
| 명령 | 설명 |
|---|
yy 또는 Y | 현재 줄 복사 |
nyy | 현재 줄부터 n줄 복사 |
yw | 커서 위치부터 단어 끝까지 복사 |
y$ | 커서 위치부터 줄 끝까지 복사 |
p | 복사(또는 삭제)한 내용을 커서 다음(아래)에 붙여넣기 |
P | 복사(또는 삭제)한 내용을 커서 앞(위)에 붙여넣기 |
7. 되돌리기 / 반복
| 명령 | 설명 |
|---|
u | 마지막 작업 취소 (undo) |
Ctrl+r | 취소한 작업 다시 실행 (redo) |
. | 마지막 명령 반복 |
8. 치환(Replace) / 변경(Change)
| 명령 | 설명 |
|---|
r문자 | 커서 위치의 한 문자를 지정한 문자로 치환 |
R | 덮어쓰기 모드로 전환하여 연속 치환 (Esc로 종료) |
cw | 커서 위치부터 단어 끝까지 변경(삭제 후 입력 모드 진입) |
cc | 현재 줄 전체 변경 |
C | 커서 위치부터 줄 끝까지 변경 |
~ | 커서 위치 문자의 대소문자 전환 |
9. 검색 및 치환
| 명령 | 설명 |
|---|
/문자열 | 아래 방향으로 문자열 검색 |
?문자열 | 위 방향으로 문자열 검색 |
n | 같은 방향으로 다음 검색 결과로 이동 |
N | 반대 방향으로 다음 검색 결과로 이동 |
:s/old/new | 현재 줄에서 첫 번째 old를 new로 치환 |
:s/old/new/g | 현재 줄에서 모든 old를 new로 치환 |
:%s/old/new/g | 문서 전체에서 모든 old를 new로 치환 |
:%s/old/new/gc | 문서 전체 치환 시 매번 확인(confirm) 요청 |
:n1,n2s/old/new/g | n1~n2번째 줄 범위에서 치환 |
10. 블록/여러 줄 작업
| 명령 | 설명 |
|---|
v | 문자 단위 비주얼(선택) 모드 시작 |
V | 줄 단위 비주얼 모드 시작 |
Ctrl+v | 블록(사각형) 단위 비주얼 모드 시작 |
:n1,n2co n3 | n1~n2번째 줄을 n3번째 줄 다음에 복사 |
:n1,n2m n3 | n1~n2번째 줄을 n3번째 줄 다음으로 이동 |
:n1,n2d | n1~n2번째 줄 삭제 |
11. 기타 유용한 명령
| 명령 | 설명 |
|---|
:set nu | 줄 번호 표시 |
:set nonu | 줄 번호 숨김 |
:set ic | 검색 시 대소문자 구분 안 함 |
J | 현재 줄과 다음 줄을 합침 |
Ctrl+g | 현재 파일명과 커서 위치(줄 번호 등) 표시 |
:r 파일명 | 커서 위치에 다른 파일 내용 삽입 |
:e 파일명 | 다른 파일 열기 |
% | 대응하는 괄호( (){}[] )로 이동 |
12. 명령 반복 사용법
대부분의 이동/삭제/복사 명령 앞에 숫자를 붙이면 그 횟수만큼 반복됩니다.
3dd → 3줄 삭제
5j → 5줄 아래로 이동
10yy → 10줄 복사
2w → 단어 2개만큼 이동
참고: 빠르게 외우면 좋은 조합
| 상황 | 명령 |
|---|
| 한 줄 삭제 후 다른 곳에 붙이기 | dd → 이동 → p |
| 한 줄 복사해서 여러 곳에 붙이기 | yy → 이동 → p (반복 가능) |
| 오타 한 글자만 고치기 | r문자 |
| 단어만 바꿔치기 | cw → 새 단어 입력 → Esc |
| 전체 치환 | :%s/old/new/g |
| 저장하고 나가기 | :wq 또는 ZZ |