Vi/Vim 완벽 가이드 | "종료가 안 돼요" 초보자를 위한 실전 사용법
이 글의 핵심
Vi/Vim 에디터 완벽 가이드. 종료 방법부터 모드, 이동, 편집, 검색, 치환까지 실전에서 바로 쓰는 명령어 총정리.
들어가며: “Vim을 켰는데 종료가 안 돼요!"
"서버에 접속했는데 메모장이 없어요”
SSH로 서버에 접속하면 GUI 에디터가 없습니다. 이때 Vi/Vim은 거의 모든 리눅스/유닉스 시스템에 기본 설치되어 있는 필수 텍스트 에디터입니다.
하지만 처음 Vim을 열면:
- 텍스트를 입력할 수 없음
- 종료 방법을 모름
- 마우스가 작동하지 않음
- 명령어가 독특함
이 글에서 다루는 것:
- 10초 만에 종료하기 (가장 많이 검색되는 질문)
- 모드 개념 (Normal, Insert, Visual, Command)
- 실전 명령어 (이동, 편집, 검색, 치환)
- 필수 설정 (.vimrc)
- 단축키 치트시트
목차
- 긴급 탈출: Vim 종료하기
- Vi vs Vim 차이
- 모드 이해하기
- 기본 이동 명령어
- 텍스트 편집
- 검색과 치환
- 복사, 붙여넣기, 삭제
- 저장과 종료
- 분할 화면
- 필수 설정 (.vimrc)
- 치트시트
1. 긴급 탈출: Vim 종료하기
가장 많이 검색되는 질문
# Vim을 열었는데 종료가 안 될 때
# 1단계: ESC 키를 여러 번 누르기
ESC ESC ESC
# 2단계: 다음 중 하나 입력
:q # 저장하지 않고 종료 (변경사항 없을 때)
:q! # 강제 종료 (변경사항 버림)
:wq # 저장 후 종료
:x # 저장 후 종료 (변경사항 있을 때만 저장)
ZZ # :x와 동일 (더 빠름)
상황별 종료 방법
| 상황 | 명령어 | 설명 |
|---|---|---|
| 아무것도 안 바꿨음 | :q | 그냥 종료 |
| 수정했는데 저장하고 싶음 | :wq 또는 ZZ | 저장 후 종료 |
| 수정했는데 버리고 싶음 | :q! | 강제 종료 |
| 파일명 지정 저장 | :w filename | 다른 이름으로 저장 |
| 읽기 전용 파일 강제 저장 | :w! | 권한 있을 때만 가능 |
2. Vi vs Vim 차이
Vi (Visual Editor)
- 1976년 개발 (거의 50년 전!)
- 모든 유닉스/리눅스에 기본 설치
- 최소한의 기능
Vim (Vi IMproved)
- 1991년 개발 (Vi의 개선판)
- 추가 기능:
- 문법 강조 (Syntax Highlighting)
- 다중 취소/재실행
- 플러그인 시스템
- 분할 화면
- 자동완성
- 비주얼 모드
확인 방법
# Vi 버전 확인
vi --version
# Vim 설치 확인
vim --version
# 대부분의 시스템에서 vi는 vim의 심볼릭 링크
ls -l $(which vi)
# lrwxrwxrwx 1 root root 20 /usr/bin/vi -> /etc/alternatives/vi
3. 모드 이해하기
Vim의 핵심: 모드
Vim은 모드 기반 에디터입니다. 같은 키가 모드에 따라 다르게 동작합니다.
graph LR
N[Normal 모드] -->|i, a, o| I[Insert 모드]
I -->|ESC| N
N -->|v, V, Ctrl+v| V[Visual 모드]
V -->|ESC| N
N -->|:| C[Command 모드]
C -->|Enter| N
1. Normal 모드 (기본)
- Vim을 열면 이 모드
- 명령어 실행 (이동, 삭제, 복사 등)
- 텍스트 입력 불가
- ESC로 언제든 돌아옴
# Normal 모드 명령어 예시
dd # 현재 줄 삭제
yy # 현재 줄 복사
p # 붙여넣기
u # 실행 취소
2. Insert 모드 (입력)
- 텍스트 입력 모드
- 일반 에디터처럼 타이핑 가능
- ESC로 Normal 모드로 복귀
# Insert 모드 진입 명령어
i # 커서 위치에서 입력
I # 줄 맨 앞에서 입력
a # 커서 다음 칸에서 입력
A # 줄 맨 뒤에서 입력
o # 아래 새 줄에서 입력
O # 위 새 줄에서 입력
3. Visual 모드 (선택)
- 텍스트 선택 모드
- 블록 지정 후 복사/삭제
v # 문자 단위 선택
V # 줄 단위 선택
Ctrl+v # 블록 단위 선택 (세로 선택)
4. Command 모드 (명령)
:로 시작- 저장, 종료, 검색, 치환 등
:w # 저장
:q # 종료
:wq # 저장 후 종료
:%s/old/new/g # 치환
4. 기본 이동 명령어
방향키 대신 hjkl
# 기본 이동 (화살표 키도 작동하지만 hjkl이 더 빠름)
h # ← 왼쪽
j # ↓ 아래
k # ↑ 위
l # → 오른쪽
왜 hjkl?: Vi가 만들어진 1970년대 키보드에는 화살표 키가 없었습니다!
단어 단위 이동
w # 다음 단어 시작
W # 다음 단어 시작 (공백 기준)
e # 다음 단어 끝
E # 다음 단어 끝 (공백 기준)
b # 이전 단어 시작
B # 이전 단어 시작 (공백 기준)
줄 단위 이동
0 # 줄 맨 앞
^ # 줄 맨 앞 (공백 제외)
$ # 줄 맨 뒤
gg # 파일 맨 앞
G # 파일 맨 뒤
:n # n번째 줄로 이동 (예: :42)
42G # 42번째 줄로 이동
화면 단위 이동
Ctrl+f # 한 화면 아래 (forward)
Ctrl+b # 한 화면 위 (backward)
Ctrl+d # 반 화면 아래 (down)
Ctrl+u # 반 화면 위 (up)
H # 화면 맨 위 (High)
M # 화면 중간 (Middle)
L # 화면 맨 아래 (Low)
5. 텍스트 편집
삭제
x # 커서 위치 문자 삭제
X # 커서 앞 문자 삭제
dd # 현재 줄 삭제
D # 커서부터 줄 끝까지 삭제
dw # 단어 삭제
d$ # 커서부터 줄 끝까지 삭제
d0 # 커서부터 줄 앞까지 삭제
dG # 커서부터 파일 끝까지 삭제
dgg # 커서부터 파일 앞까지 삭제
변경
r # 커서 위치 문자 교체 (1글자)
R # 덮어쓰기 모드
cw # 단어 변경 (change word)
cc # 줄 변경
C # 커서부터 줄 끝까지 변경
s # 문자 삭제 후 입력 모드
S # 줄 삭제 후 입력 모드
취소/재실행
u # 실행 취소 (undo)
Ctrl+r # 재실행 (redo)
. # 마지막 명령 반복
6. 검색과 치환
검색
/pattern # 앞으로 검색
?pattern # 뒤로 검색
n # 다음 검색 결과
N # 이전 검색 결과
* # 커서 위치 단어 검색
# # 커서 위치 단어 역방향 검색
예시:
/error # "error" 검색
n # 다음 error로 이동
N # 이전 error로 이동
치환
:s/old/new/ # 현재 줄에서 첫 번째 old를 new로
:s/old/new/g # 현재 줄에서 모든 old를 new로
:%s/old/new/g # 전체 파일에서 모든 old를 new로
:%s/old/new/gc # 전체 파일, 확인하며 치환
:5,10s/old/new/g # 5~10번째 줄에서 치환
실전 예시:
# Python에서 print 문을 logging으로 변경
:%s/print(/logging.info(/g
# 탭을 4개 공백으로 변경
:%s/\t/ /g
# 줄 끝 공백 제거
:%s/\s\+$//g
7. 복사, 붙여넣기, 삭제
복사 (Yank)
yy # 현재 줄 복사
Y # 현재 줄 복사 (yy와 동일)
yw # 단어 복사
y$ # 커서부터 줄 끝까지 복사
yG # 커서부터 파일 끝까지 복사
붙여넣기 (Paste)
p # 커서 뒤에 붙여넣기
P # 커서 앞에 붙여넣기
Visual 모드로 복사
# 1. v로 Visual 모드 진입
# 2. hjkl로 선택 범위 지정
# 3. y로 복사 (또는 d로 잘라내기)
# 4. p로 붙여넣기
예시:
# 5줄 복사하기
5yy # 현재 줄부터 5줄 복사
p # 붙여넣기
# 블록 복사
Ctrl+v # 블록 선택 모드
jjjj # 아래로 4줄 선택
lll # 오른쪽으로 3칸 선택
y # 복사
p # 붙여넣기
8. 저장과 종료
저장
:w # 저장
:w filename # 다른 이름으로 저장
:w! # 강제 저장 (읽기 전용 파일)
:w >> file # 파일 끝에 추가
:5,10w file # 5~10번째 줄만 저장
종료
:q # 종료 (변경사항 없을 때)
:q! # 강제 종료 (변경사항 버림)
:wq # 저장 후 종료
:x # 저장 후 종료 (변경사항 있을 때만)
ZZ # :x와 동일 (더 빠름)
ZQ # :q!와 동일
9. 분할 화면
수평/수직 분할
:split filename # 수평 분할
:sp filename # 수평 분할 (축약)
:vsplit filename # 수직 분할
:vsp filename # 수직 분할 (축약)
# 빈 창 분할
:split # 수평
:vsplit # 수직
창 간 이동
Ctrl+w h # 왼쪽 창
Ctrl+w j # 아래 창
Ctrl+w k # 위 창
Ctrl+w l # 오른쪽 창
Ctrl+w w # 다음 창
창 크기 조절
Ctrl+w = # 모든 창 크기 동일
Ctrl+w + # 현재 창 높이 증가
Ctrl+w - # 현재 창 높이 감소
Ctrl+w > # 현재 창 너비 증가
Ctrl+w < # 현재 창 너비 감소
10. 필수 설정 (.vimrc)
.vimrc 파일 생성
# 홈 디렉토리에 .vimrc 생성
vim ~/.vimrc
추천 기본 설정
" 기본 설정
set nocompatible " Vi 호환 모드 끄기
syntax on " 문법 강조
set number " 줄 번호 표시
set relativenumber " 상대 줄 번호
set cursorline " 커서 줄 강조
set ruler " 커서 위치 표시
" 들여쓰기
set autoindent " 자동 들여쓰기
set smartindent " 스마트 들여쓰기
set tabstop=4 " 탭 크기
set shiftwidth=4 " 자동 들여쓰기 크기
set expandtab " 탭을 공백으로 변환
" 검색
set hlsearch " 검색 결과 강조
set incsearch " 점진적 검색
set ignorecase " 대소문자 무시
set smartcase " 대문자 포함 시 대소문자 구분
" UI
set showmatch " 괄호 매칭 표시
set wildmenu " 명령어 자동완성
set laststatus=2 " 상태바 항상 표시
set showcmd " 명령어 표시
" 편의 기능
set mouse=a " 마우스 사용
set clipboard=unnamed " 시스템 클립보드 사용
set encoding=utf-8 " UTF-8 인코딩
set backspace=indent,eol,start " 백스페이스 동작
" 파일 타입별 설정
filetype plugin indent on
" 색상 테마
colorscheme desert " 색상 테마 (기본 제공)
언어별 설정
" Python
autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab
" JavaScript
autocmd FileType javascript setlocal tabstop=2 shiftwidth=2 expandtab
" Go
autocmd FileType go setlocal tabstop=4 shiftwidth=4 noexpandtab
" Makefile (탭 필수)
autocmd FileType make setlocal noexpandtab
11. 치트시트
모드 전환
| 명령어 | 동작 |
|---|---|
ESC | Normal 모드로 |
i | Insert 모드 (커서 위치) |
a | Insert 모드 (커서 다음) |
o | Insert 모드 (아래 새 줄) |
v | Visual 모드 |
: | Command 모드 |
필수 명령어 Top 20
| 명령어 | 동작 | 사용 빈도 |
|---|---|---|
:wq | 저장 후 종료 | ⭐⭐⭐⭐⭐ |
:q! | 강제 종료 | ⭐⭐⭐⭐⭐ |
dd | 줄 삭제 | ⭐⭐⭐⭐⭐ |
yy | 줄 복사 | ⭐⭐⭐⭐ |
p | 붙여넣기 | ⭐⭐⭐⭐⭐ |
u | 실행 취소 | ⭐⭐⭐⭐⭐ |
/pattern | 검색 | ⭐⭐⭐⭐ |
:%s/old/new/g | 전체 치환 | ⭐⭐⭐⭐ |
gg | 파일 맨 앞 | ⭐⭐⭐ |
G | 파일 맨 뒤 | ⭐⭐⭐ |
0 | 줄 맨 앞 | ⭐⭐⭐ |
$ | 줄 맨 뒤 | ⭐⭐⭐ |
dw | 단어 삭제 | ⭐⭐⭐ |
cw | 단어 변경 | ⭐⭐⭐ |
A | 줄 끝에서 입력 | ⭐⭐⭐ |
o | 아래 새 줄 | ⭐⭐⭐ |
Ctrl+f | 한 화면 아래 | ⭐⭐ |
Ctrl+b | 한 화면 위 | ⭐⭐ |
. | 마지막 명령 반복 | ⭐⭐⭐ |
* | 단어 검색 | ⭐⭐ |
실전 시나리오
시나리오 1: 설정 파일 수정
# 1. 파일 열기
vim /etc/nginx/nginx.conf
# 2. 특정 줄 찾기
/listen
# 3. 포트 번호 변경
cw8080<ESC>
# 4. 저장 후 종료
:wq
시나리오 2: 로그 파일 분석
# 1. 로그 파일 열기
vim /var/log/app.log
# 2. 에러 검색
/ERROR
# 3. 다음 에러로 이동
n
# 4. 에러 줄 복사
yy
# 5. 종료 (저장 안 함)
:q
시나리오 3: 코드 리팩토링
# 1. 파일 열기
vim app.py
# 2. 함수명 변경 (oldFunc → newFunc)
:%s/oldFunc/newFunc/g
# 3. 확인
:noh # 검색 강조 제거
# 4. 저장
:w
정리
핵심 요약
- 종료:
ESC→:wq(저장 후 종료) 또는:q!(강제 종료) - 모드: Normal (기본) ↔ Insert (입력) ↔ Visual (선택)
- 이동:
hjkl,gg,G,0,$ - 편집:
dd(삭제),yy(복사),p(붙여넣기) - 검색:
/pattern,n(다음),N(이전) - 치환:
:%s/old/new/g
학습 로드맵
1일차: 종료, 모드 전환, 기본 이동
# 연습
vim practice.txt
i # Insert 모드
(타이핑)
ESC
:wq
2일차: 편집 명령어
dd # 삭제
yy # 복사
p # 붙여넣기
u # 취소
3일차: 검색과 치환
/pattern
:%s/old/new/g
1주차: .vimrc 설정, 플러그인 설치
추가 학습 자료
# Vim 내장 튜토리얼
vimtutor
# 도움말
:help
:help dd
:help search
자주 하는 실수
❌ 실수 1: Insert 모드에서 명령어 입력
# ❌ Insert 모드에서 :wq 입력 → 텍스트로 입력됨
# ✅ ESC로 Normal 모드로 먼저 전환
❌ 실수 2: Caps Lock 켜진 상태
# Vim은 대소문자를 구분합니다
# i (Insert) ≠ I (줄 앞에서 Insert)
❌ 실수 3: 마우스로 복사/붙여넣기
# ❌ 터미널 마우스 복사 → 포맷 깨짐
# ✅ yy, p 명령어 사용
다음 단계
Vim 마스터하기
- 플러그인 매니저 설치: vim-plug, Vundle
- 인기 플러그인:
- NERDTree (파일 탐색기)
- fzf.vim (파일 검색)
- vim-airline (상태바)
- YouCompleteMe (자동완성)
- Neovim 고려: Vim의 현대적 포크
대안 에디터
- Nano: 더 쉬운 터미널 에디터
- Emacs: Vim의 라이벌
- VSCode + Vim 플러그인: GUI + Vim 키바인딩
관련 글
- Shell/Bash/Zsh 완벽 가이드
- Linux 명령어 가이드
- Git 완벽 가이드
Vim 마스터하고 생산성 10배 올리기! 🚀