Vi/Vim 완벽 가이드 | "종료가 안 돼요" 초보자를 위한 실전 사용법

Vi/Vim 완벽 가이드 | "종료가 안 돼요" 초보자를 위한 실전 사용법

이 글의 핵심

Vi/Vim 에디터 완벽 가이드. 종료 방법부터 모드, 이동, 편집, 검색, 치환까지 실전에서 바로 쓰는 명령어 총정리.

들어가며: “Vim을 켰는데 종료가 안 돼요!"

"서버에 접속했는데 메모장이 없어요”

SSH로 서버에 접속하면 GUI 에디터가 없습니다. 이때 Vi/Vim은 거의 모든 리눅스/유닉스 시스템에 기본 설치되어 있는 필수 텍스트 에디터입니다.

하지만 처음 Vim을 열면:

  • 텍스트를 입력할 수 없음
  • 종료 방법을 모름
  • 마우스가 작동하지 않음
  • 명령어가 독특함

이 글에서 다루는 것:

  • 10초 만에 종료하기 (가장 많이 검색되는 질문)
  • 모드 개념 (Normal, Insert, Visual, Command)
  • 실전 명령어 (이동, 편집, 검색, 치환)
  • 필수 설정 (.vimrc)
  • 단축키 치트시트

목차

  1. 긴급 탈출: Vim 종료하기
  2. Vi vs Vim 차이
  3. 모드 이해하기
  4. 기본 이동 명령어
  5. 텍스트 편집
  6. 검색과 치환
  7. 복사, 붙여넣기, 삭제
  8. 저장과 종료
  9. 분할 화면
  10. 필수 설정 (.vimrc)
  11. 치트시트

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. 치트시트

모드 전환

명령어동작
ESCNormal 모드로
iInsert 모드 (커서 위치)
aInsert 모드 (커서 다음)
oInsert 모드 (아래 새 줄)
vVisual 모드
: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

정리

핵심 요약

  1. 종료: ESC:wq (저장 후 종료) 또는 :q! (강제 종료)
  2. 모드: Normal (기본) ↔ Insert (입력) ↔ Visual (선택)
  3. 이동: hjkl, gg, G, 0, $
  4. 편집: dd (삭제), yy (복사), p (붙여넣기)
  5. 검색: /pattern, n (다음), N (이전)
  6. 치환: :%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 마스터하기

  1. 플러그인 매니저 설치: vim-plug, Vundle
  2. 인기 플러그인:
    • NERDTree (파일 탐색기)
    • fzf.vim (파일 검색)
    • vim-airline (상태바)
    • YouCompleteMe (자동완성)
  3. Neovim 고려: Vim의 현대적 포크

대안 에디터

  • Nano: 더 쉬운 터미널 에디터
  • Emacs: Vim의 라이벌
  • VSCode + Vim 플러그인: GUI + Vim 키바인딩

관련 글

Vim 마스터하고 생산성 10배 올리기! 🚀

... 996 lines not shown ... Token usage: 63706/1000000; 936294 remaining Start-Sleep -Seconds 3