Vim 완벽 가이드: 키보드만으로 코딩하기
VS Code나 IntelliJ를 잘 쓰고 있었는데, 어느 날 서버에 SSH로 접속해서 파일을 수정할 일이 생겼습니다.
vim config.yaml을 입력했더니 화면이 바뀌면서 커서가 깜빡이고 있어요.
키보드를 누르는데 글자가 입력이 안 됩니다.
아니, 입력되는 것 같기도 한데 이상한 동작을 하고 있어요.
끄고 싶은데 Ctrl+C도 안 먹히고, Ctrl+W를 눌렀더니 창이 닫히는 대신 뭔가 다른 일이 벌어집니다.
이 상황, 개발자라면 한 번쯤 겪어보셨을 거예요. 😅
“Vim 종료하는 법”은 Stack Overflow에서 200만 뷰가 넘는 질문이기도 합니다. 그만큼 많은 사람이 처음 Vim 앞에서 당황한다는 뜻이죠.
이 글에서는 그 당황스러운 첫 만남을 넘어서 Vim을 제대로 다룰 수 있게 되기까지 필요한 내용을 정리해보겠습니다.
Vim에 내장된 vimtutor의 커리큘럼을 기반으로 커서 이동부터 검색과 치환, 파일 관리, Vim만의 강력한 편집 문법까지 다뤄요.
끝까지 읽고 나면 Vim을 범용 편집기로 자신 있게 쓸 수 있을 거예요.
Vim이 특별한 이유
왜 2026년에도 Vim 이야기를 하는지부터 짚고 넘어갈게요.
Vim의 뿌리는 1976년 빌 조이(Bill Joy)가 BSD 유닉스에서 만든 vi입니다. 마우스가 없던 시절, 키보드만으로 모든 편집을 해야 했기 때문에 모드 기반 인터페이스라는 독특한 방식이 탄생했어요.
1991년에 브람 무릴나르(Bram Moolenaar)가 vi를 기반으로 Vim(Vi IMproved)을 만들었습니다. 이름 그대로 vi의 개선판인데, 다중 실행 취소, 구문 강조, 플러그인 시스템 같은 현대적인 기능을 대폭 추가했어요. 오픈소스로 공개되면서 개발자 커뮤니티에서 폭발적인 인기를 얻었고 거의 50년째 현역입니다. Stack Overflow 개발자 설문에서 해마다 상위권에 이름을 올리고 서버 관리자부터 시니어 개발자까지 폭넓은 사용자층을 유지하고 있거든요.
이렇게 오래 살아남은 데에는 이유가 있습니다.
거의 모든 리눅스/유닉스 서버에 기본 설치되어 있어요. SSH로 원격 서버에 접속했을 때 VS Code는 없지만 Vim은 있습니다. 서버 설정 파일을 수정하거나 로그를 확인할 때 Vim을 쓸 줄 알면 어디서든 작업할 수 있죠.
키보드에서 손을 떼지 않고 모든 편집을 할 수 있다는 것도 큰 장점이에요. 마우스를 잡으러 손을 옮기는 그 짧은 시간이 쌓이면 생각보다 차이가 나거든요. Vim에 익숙해지면 텍스트를 다루는 속도가 확실히 빨라집니다.
Vim의 편집 방식이 Vim 밖에서도 통한다는 점도 빼놓을 수 없어요. VS Code에는 Vim 확장이 있고 IntelliJ에는 IdeaVim이 있고 브라우저에도 Vimium 같은 확장이 있습니다. Vim의 조작법을 한번 배워두면 여러 도구에서 써먹을 수 있는 셈이죠.
먼저 살아남기: 종료하는 법
Vim에서 제일 먼저 알아야 할 건 역시 종료하는 방법입니다. 농담이 아니에요.
Vim을 종료하려면 Esc를 한 번 누른 다음 :q를 입력하고 Enter를 치면 돼요.
Esc → :q → Enter
파일을 수정했는데 저장하지 않고 나가려고 하면 Vim이 경고를 보여줍니다.
강제로 나가려면 :q!를, 저장하고 나가려면 :wq를 쓰면 돼요.
(참고로 코드 예제에서 "는 Vim의 주석 기호입니다. " 뒤의 내용은 설명이니 직접 입력하지 않아도 돼요.)
:q " 종료 (변경사항 없을 때)
:q! " 저장하지 않고 강제 종료
:w " 저장
:wq " 저장하고 종료
:wq! " 강제 저장 후 종료
Esc를 먼저 누르는 이유는 뒤에서 설명할 모드 때문입니다.
지금은 “뭔가 이상하면 일단 Esc를 누르자”라고만 기억해두세요.
Vim에서 길을 잃었을 때 Esc는 비상구 같은 키입니다.
모드라는 개념
Vim이 다른 편집기와 근본적으로 다른 점이 바로 모드(mode)입니다.
VS Code에서는 키보드를 누르면 글자가 바로 입력되죠. Vim은 다릅니다. 현재 어떤 모드에 있느냐에 따라 같은 키가 완전히 다른 동작을 해요.
가장 중요한 두 가지 모드부터 보겠습니다.
Normal 모드는 Vim을 처음 켰을 때 들어가는 기본 모드입니다. 이 모드에서는 키보드를 눌러도 글자가 입력되지 않아요. 대신 커서를 이동하고 텍스트를 복사하고 삭제하고 검색하는 등의 명령을 실행합니다. 처음 Vim을 켰을 때 글자가 안 쳐지는 게 바로 이 모드 때문이에요.
Insert 모드는 일반 편집기처럼 글자를 입력하는 모드입니다.
Normal 모드에서 i를 누르면 Insert 모드로 들어가고, Esc를 누르면 다시 Normal 모드로 돌아옵니다.
Normal 모드 ──(i)──▶ Insert 모드
◀──(Esc)──
처음에는 “왜 이렇게 불편하게 만들었지?”라는 생각이 들 겁니다.
글을 입력하려면 매번 i를 눌러야 하고, 커서를 옮기려면 Esc를 눌러서 나와야 하니까요.
그런데 이게 의도된 설계입니다. 코딩할 때 새 코드를 작성하는 시간보다 기존 코드를 읽고 수정하는 시간이 훨씬 길거든요. Normal 모드를 기본으로 두는 건 “대부분의 시간은 코드를 탐색하고 조작하는 데 쓴다”는 현실을 반영한 거예요. Insert 모드에 들어가서 필요한 만큼만 입력하고 바로 Normal 모드로 돌아오는 게 Vim의 기본 리듬입니다.
이 두 모드 외에도 Visual 모드(v로 진입, 텍스트 선택용), Replace 모드(R로 진입, 덮어쓰기용), Command 모드(: 입력, 명령 실행용)가 있는데 뒤에서 하나씩 다루겠습니다.
커서 이동하기
Normal 모드에서 커서를 이동하는 기본 키는 h, j, k, l입니다.
k (위)
↑
h (좌) ← → l (우)
↓
j (아래)
왜 하필 hjkl일까요?
h는 왼쪽 끝에 있어서 왼쪽으로, l은 오른쪽 끝에 있어서 오른쪽으로 이동합니다.
j는 아래로 향하는 화살표(↓)처럼 생겨서 아래로 이동한다고 외우면 돼요.
방향키도 동작하긴 하지만, hjkl을 쓰는 이유가 있습니다.
오른손이 홈 포지션에 그대로 있으면서 이동할 수 있거든요.
방향키까지 손을 뻗었다가 다시 돌아오는 그 시간이 없어지는 거죠.
처음에는 어색하지만 며칠 참고 쓰다 보면 오히려 방향키에 손이 가는 게 답답해집니다.
한 글자씩 이동하는 것만으로는 느리니까 더 빠른 이동법도 알아두면 좋습니다.
w " 다음 단어의 시작으로
b " 이전 단어의 시작으로
e " 현재 단어의 끝으로
0 " 줄의 맨 앞으로
^ " 줄의 첫 번째 글자로 (공백 제외)
$ " 줄의 맨 끝으로
gg " 파일의 맨 위로
G " 파일의 맨 아래로
42G " 42번째 줄로 이동 (숫자+G)
Ctrl+d " 반 페이지 아래로 스크롤
Ctrl+u " 반 페이지 위로 스크롤
gg와 G는 설정 파일을 열어서 특정 부분을 찾을 때 자주 씁니다.
G로 파일 맨 아래로 가서 새 설정을 추가한다거나 gg로 맨 위로 돌아가서 import 구문을 확인하는 식이죠.
숫자로 이동 반복하기
모션 앞에 숫자를 붙이면 그만큼 반복됩니다. 이건 Vim 전체에서 일관되게 적용되는 규칙이에요.
2w " 단어 2개 앞으로
3e " 단어 3개의 끝으로
5j " 5줄 아래로
10k " 10줄 위로
예를 들어 “7줄 아래에 있는 코드로 가고 싶다”면 7j를 누르면 됩니다.
j를 일곱 번 누르는 것보다 훨씬 빠르죠.
이 숫자 조합은 커서 이동뿐 아니라 편집 명령에서도 동일하게 동작하는데, 뒤에서 자세히 다루겠습니다.
기본 편집: 삭제
Normal 모드에서 글자를 삭제하는 가장 간단한 방법은 x입니다.
커서가 올라가 있는 글자 하나를 지워요.
x " 커서 위의 글자 하나 삭제
오타를 고칠 때 유용합니다.
커서를 잘못된 글자 위로 옮긴 다음 x를 누르면 그 글자가 사라지죠.
기본 편집: 삽입
Insert 모드에 들어가는 방법이 i만 있는 건 아닙니다.
상황에 따라 다른 키를 쓰면 더 효율적이에요.
i " 커서 위치에서 입력 시작
a " 커서 다음 위치에서 입력 시작 (append)
o " 아래에 새 줄을 만들고 입력 시작
O " 위에 새 줄을 만들고 입력 시작
A " 줄 맨 끝에서 입력 시작
i는 커서 앞에 삽입하고, a는 커서 뒤에 삽입합니다.
차이가 미묘하지만, 줄 중간에 글자를 추가할 때 커서 위치를 정확히 맞추지 않아도 되어서 편해요.
A는 줄 끝으로 이동해서 바로 입력을 시작하니까 줄 끝에 뭔가 덧붙일 때 $로 이동한 다음 a를 누르는 것보다 A 한 번이 낫죠.
o는 정말 자주 쓰게 됩니다.
함수 안에 새 줄을 추가할 때 일반 편집기에서는 줄 끝으로 이동한 다음 Enter를 치겠지만 Vim에서는 그냥 o를 누르면 끝이에요.
O는 반대로 현재 줄 위에 새 줄을 만듭니다.
Insert 모드에서 편집이 끝나면 Esc를 눌러서 Normal 모드로 돌아오는 것. 잊지 마세요.
단어 삭제와 줄 삭제
x가 글자 하나를 지운다면, dw는 단어 하나를 지웁니다.
dw " 커서부터 다음 단어 시작까지 삭제
de " 커서부터 현재 단어 끝까지 삭제
d$ " 커서부터 줄 끝까지 삭제
dd " 줄 전체 삭제
d는 삭제(delete) 명령이고 뒤에 오는 게 “어디까지 지울 것인가”를 정하는 모션입니다.
dw는 “다음 단어 시작까지 삭제”, d$는 “줄 끝까지 삭제”인 거죠.
dd는 d를 두 번 누르는 건데 이렇게 같은 키를 두 번 누르면 그 명령이 줄 전체에 적용돼요.
dd가 워낙 자주 쓰이기 때문에 vi를 설계한 사람들이 d를 두 번 누르는 것만으로 줄 전체를 지우게 만든 거예요.
숫자를 조합하면 여러 단어나 줄을 한 번에 지울 수 있습니다.
d2w " 단어 2개 삭제
3dd " 3줄 삭제
동사 + 숫자 + 명사
여기서부터 Vim이 진짜 빛나기 시작합니다.
Vim의 편집 명령은 영어 문장처럼 동사 + 명사 구조로 조합됩니다. 동사(operator)는 “무엇을 할 것인가”이고, 명사(motion)는 “어디까지 적용할 것인가”예요. 그 사이에 숫자를 넣으면 반복 횟수가 됩니다.
동사(operator) + [숫자] + 명사(motion)
주요 동사는 세 가지입니다.
d " 삭제 (delete)
c " 변경 (change: 삭제 후 Insert 모드 진입)
y " 복사 (yank)
명사는 앞에서 배운 이동 키들이 그대로 쓰입니다.
w " 다음 단어 시작까지
e " 현재 단어 끝까지
$ " 줄 끝까지
0 " 줄 처음까지
이걸 조합하면 이런 명령이 됩니다.
dw " 다음 단어까지 삭제 (delete + word)
d$ " 줄 끝까지 삭제 (delete + 줄 끝)
ce " 단어 끝까지 지우고 입력 모드 (change + end of word)
c$ " 줄 끝까지 지우고 입력 모드 (change + 줄 끝)
y$ " 줄 끝까지 복사 (yank + 줄 끝)
d2w " 단어 2개 삭제 (delete + 2 + word)
c(change) 명령은 d(delete)와 비슷하지만, 삭제 후에 바로 Insert 모드로 들어간다는 차이가 있어요.
변수명을 바꾸고 싶을 때 cw를 누르면 단어가 지워지면서 바로 새 이름을 입력할 수 있으니까 dw로 지우고 i로 Insert 모드에 들어가는 것보다 한 단계가 줄어들죠.
cc는 줄 전체를 지우고 Insert 모드로 들어갑니다.
여기에 i(inner)와 a(around)를 끼우면 더 정밀한 범위 지정이 됩니다.
diw " 단어 삭제 (delete inner word)
ciw " 단어를 지우고 입력 모드 (change inner word)
di" " 따옴표 안의 내용 삭제
ci( " 괄호 안의 내용을 지우고 입력 모드
da" " 따옴표까지 포함해서 삭제
예를 들어 코드에서 함수의 인자를 통째로 바꾸고 싶다면?
커서를 괄호 안에 두고 ci(를 누르면 됩니다.
괄호 안의 내용이 싹 지워지면서 Insert 모드로 들어가니까 바로 새 인자를 입력하면 돼요.
마우스로 드래그해서 선택하고 지우고 타이핑하는 것보다 확실히 빠릅니다.
실행 취소와 다시 실행
편집하다 보면 실수는 피할 수 없죠. Vim은 실행 취소 시스템이 잘 갖춰져 있습니다.
u " 실행 취소 (여러 번 누를 수 있음)
Ctrl+r " 실행 취소한 걸 다시 되돌리기 (redo)
U " 현재 줄의 모든 변경을 원래 상태로 복원
u가 Vim에서의 Ctrl+Z라고 생각하면 됩니다.
여러 번 누르면 그만큼 이전 상태로 돌아가요.
Ctrl+r은 반대로 실행 취소한 것을 다시 되돌립니다.
U(대문자)는 좀 특별한데 그 줄에서 일어난 모든 변경을 한꺼번에 원래 상태로 되돌려줍니다.
한 줄을 이리저리 고치다가 “처음부터 다시 할래”라고 생각이 들면 U를 누르면 돼요.
뭔가 심하게 꼬였다 싶으면 :e!를 입력해 보세요. 마지막으로 저장한 상태로 파일을 다시 불러옵니다.
최후의 수단이니까 자주 저장하는 습관을 들이는 게 좋겠죠.
잘라내기와 붙여넣기
Vim에서 dd로 줄을 삭제하면 그 줄이 그냥 사라지는 게 아니라 Vim의 레지스터(일종의 클립보드)에 저장됩니다.
p를 누르면 삭제한 내용이 커서 아래에 붙여넣어져요.
dd " 줄 삭제 (레지스터에 저장됨)
p " 커서 아래/뒤에 붙여넣기
P " 커서 위/앞에 붙여넣기
이걸 활용하면 줄 순서를 쉽게 바꿀 수 있습니다.
이동시키고 싶은 줄에서 dd로 잘라낸 다음 원하는 위치로 커서를 옮기고 p를 누르면 그 아래에 들어가요.
x로 지운 글자, dw로 지운 단어도 마찬가지로 p로 붙여넣을 수 있습니다.
글자 교체하기
오타를 고칠 때 x로 지우고 i로 다시 입력하는 것보다 더 빠른 방법이 있습니다.
r " 커서 위의 글자를 하나만 교체
R " Replace 모드 진입 (여러 글자를 연속으로 교체)
r 다음에 새 글자를 누르면 커서 위의 글자가 바로 바뀝니다.
Insert 모드에 들어갔다 나올 필요가 없어서 한 글자만 고칠 때 아주 편해요.
R(대문자)을 누르면 Replace 모드에 들어가는데 이 모드에서는 타이핑하는 글자가 기존 글자를 하나씩 덮어씁니다.
일반 편집기의 “덮어쓰기” 모드와 같아요.
여러 글자를 연속으로 교체해야 할 때 유용하고 Esc를 누르면 다시 Normal 모드로 돌아옵니다.
복사와 붙여넣기
줄을 삭제하지 않고 복사만 하고 싶을 때는 y(yank) 명령을 씁니다.
yy " 줄 전체 복사
yw " 다음 단어까지 복사
y$ " 줄 끝까지 복사
p " 붙여넣기
Visual 모드와 함께 쓰면 더 직관적입니다.
v를 눌러서 Visual 모드에 들어간 다음 이동 키로 복사할 범위를 선택하고 y를 누르면 선택한 텍스트가 복사돼요.
그다음 원하는 위치로 이동해서 p를 누르면 됩니다.
v " Visual 모드 시작 (글자 단위 선택)
V " Visual Line 모드 시작 (줄 단위 선택)
Visual 모드에서는 선택 영역이 하이라이트되니까 뭘 선택하고 있는지 눈으로 확인할 수 있어서 초보자에게 특히 유용합니다.
선택한 상태에서 d를 누르면 삭제, y를 누르면 복사예요.
파일 내 위치 확인과 이동
파일을 편집하다 보면 “지금 내가 파일의 어디쯤에 있는 거지?” 궁금해질 때가 있어요.
Ctrl+g를 누르면 화면 하단에 파일명과 현재 위치 정보가 표시돼요.
Ctrl+g " 파일명과 현재 줄 번호 표시
G " 파일 맨 아래로 이동
gg " 파일 맨 위로 이동
42G " 42번째 줄로 이동
에러 메시지에 “line 42”가 나왔다면 42G로 바로 그 줄로 이동할 수 있습니다.
검색하기
파일 안에서 특정 텍스트를 찾으려면 Normal 모드에서 /를 누르고 검색어를 입력합니다.
/function " "function"을 앞으로 검색
?function " "function"을 뒤로 검색
n " 같은 방향으로 다음 결과
N " 반대 방향으로 다음 결과
/는 앞쪽(아래)으로, ?는 뒤쪽(위)으로 검색합니다.
검색이 파일 끝에 도달하면 자동으로 파일 처음부터 다시 검색을 이어가요.
검색 후 원래 있던 위치로 돌아가고 싶으면 Ctrl+o를 누르면 됩니다.
Ctrl+o는 이전 위치로, Ctrl+i는 다음 위치로 이동하는 점프 명령입니다.
코드를 읽다가 정의를 찾으러 갔다가 다시 돌아올 때 유용합니다.
*을 누르면 현재 커서가 위치한 단어를 바로 검색합니다.
변수명이 어디서 쓰이는지 빠르게 확인할 때 유용해요.
검색 하이라이트가 계속 남아있어서 눈에 거슬린다면 :noh(no highlight)를 입력하면 꺼집니다.
괄호 짝 찾기
코드를 작성하다 보면 괄호가 제대로 짝이 맞는지 확인해야 할 때가 있죠.
% 키는 커서가 올라가 있는 괄호의 짝을 찾아줍니다.
% " 짝이 되는 (, ), [, ], {, } 로 이동
(에 커서를 두고 %를 누르면 짝이 되는 )로 이동하고, 다시 %를 누르면 원래 (로 돌아옵니다.
[와 ], {와 } 모두 동일하게 동작해요.
중첩된 괄호가 복잡하게 얽힌 코드에서 “이 여는 괄호의 닫는 괄호가 어디 있지?”를 확인할 때 매우 유용합니다.
치환하기
검색과 함께 치환도 자주 사용됩니다.
:s/old/new " 현재 줄에서 첫 번째 old를 new로 치환
:s/old/new/g " 현재 줄에서 모든 old를 new로 치환
:#,#s/old/new/g " #번 줄부터 #번 줄까지 치환 (예: :10,20s/old/new/g)
:%s/old/new/g " 파일 전체에서 치환
:%s/old/new/gc " 파일 전체에서 하나씩 확인하면서 치환
g 플래그를 안 붙이면 각 줄에서 첫 번째로 일치하는 것만 바뀌니까 주의하세요.
g를 붙여야 줄의 모든 일치 항목이 바뀝니다.
gc 옵션을 붙이면 매번 “바꿀까요?”라고 물어보기 때문에 실수로 엉뚱한 곳을 바꿀 위험이 줄어듭니다.
처음에는 이 옵션을 쓰는 게 안전해요.
외부 명령 실행하기
Vim 안에서 터미널 명령을 실행할 수도 있어요.
:! 뒤에 쉘 명령을 입력하면 됩니다.
:!ls " 디렉토리 목록 보기
:!python % " 현재 편집 중인 파일을 Python으로 실행
:!gcc % -o out " 현재 파일을 C 컴파일러로 컴파일
Vim을 나가지 않고 코드를 실행해보거나 파일 목록을 확인하거나 Git 명령을 돌릴 수 있어서 작업 흐름이 끊기지 않아요.
파일 저장과 읽기
기본적인 저장과 종료 외에도 알아두면 유용한 파일 관련 명령이 있습니다.
:w " 저장
:w filename " 다른 이름으로 저장
:r filename " 다른 파일의 내용을 현재 위치에 삽입
:r !ls " 외부 명령의 출력을 현재 위치에 삽입
:w filename은 현재 편집 중인 내용을 다른 파일로 저장합니다.
“다른 이름으로 저장”과 비슷해요.
:r은 반대로 외부 내용을 불러옵니다.
:r filename은 다른 파일의 내용을 커서 아래에 삽입하고 :r !ls처럼 !을 붙이면 쉘 명령의 출력 결과를 삽입해요.
코드 조각을 다른 파일에서 가져올 때 편리합니다.
Visual 모드로 텍스트를 선택한 다음 :w filename을 입력하면 선택한 부분만 따로 파일로 저장할 수도 있어요.
파일과 버퍼
Vim에서 파일을 열면 그 내용이 “버퍼(buffer)“라는 메모리 공간에 올라갑니다. 여러 파일을 열면 버퍼가 여러 개 생기고 이 사이를 오가면서 편집할 수 있어요.
:e filename " 파일 열기
:ls " 열려 있는 버퍼 목록 보기
:bnext 또는 :bn " 다음 버퍼로 이동
:bprev 또는 :bp " 이전 버퍼로 이동
:bd " 현재 버퍼 닫기
화면을 분할해서 여러 파일을 동시에 볼 수도 있습니다.
:split filename " 수평 분할 (또는 :sp)
:vsplit filename " 수직 분할 (또는 :vsp)
분할된 창 사이를 이동할 때는 Ctrl+w 다음에 방향키(h, j, k, l)를 누르면 됩니다.
Ctrl+w Ctrl+w로 다음 창으로 순환 이동할 수도 있고요.
한쪽에서 코드를 보면서 다른 쪽에서 테스트 파일을 편집하는 식의 작업이 가능합니다.
반복 명령
.(점)은 의외로 강력한 명령입니다.
방금 했던 편집 동작을 그대로 반복해줘요.
. " 마지막 편집 명령 반복
ciw로 단어를 “hello”로 바꾼 다음 같은 수정이 필요한 다른 위치로 이동해서 .을 누르면 같은 동작이 반복됩니다. 그 단어도 “hello”로 바뀌는 거죠.
검색(n)과 조합하면 “찾아서 바꾸기”를 수동으로 제어할 수 있어요.
n으로 다음 결과를 확인하고 바꿀 곳이면 .을, 건너뛸 곳이면 다시 n을 누르는 식이죠.
설정 옵션 다루기
Vim의 동작을 바꾸고 싶을 때 :set 명령을 씁니다.
편집 중에 실시간으로 설정을 바꿀 수 있어요.
:set ic " 검색 시 대소문자 무시 (ignorecase)
:set noic " 대소문자 구분 다시 켜기
:set hls " 검색 결과 하이라이트 (hlsearch)
:set is " 타이핑하면서 실시간 검색 (incsearch)
:set number " 줄 번호 표시
:set nonumber " 줄 번호 숨기기
set 뒤에 no를 붙이면 그 옵션을 끄는 겁니다.
짧은 이름(ic, hls, is)과 긴 이름(ignorecase, hlsearch, incsearch) 중 아무거나 써도 돼요.
대소문자를 무시하고 검색하되 한 번만 그렇게 하고 싶다면 검색어 뒤에 \c를 붙이는 방법도 있습니다.
/ignore\c처럼 입력하면 해당 검색에서만 대소문자를 무시해요.
도움말 사용하기
Vim에는 방대한 내장 도움말이 있습니다.
:help 명령 하나면 거의 모든 기능에 대한 설명을 찾을 수 있어요.
:help " 도움말 창 열기
:help w " w 명령에 대한 도움말
:help :w " :w 명령에 대한 도움말
:help insert-index " Insert 모드 명령어 목록
도움말 창이 열리면 Ctrl+w Ctrl+w로 편집 창과 도움말 창 사이를 오갈 수 있고, :q로 도움말 창을 닫으면 됩니다.
: 명령을 입력할 때 Ctrl+d를 누르면 가능한 자동 완성 목록이 나타납니다.
Tab을 누르면 자동 완성이 적용되고요.
예를 들어 :e까지 입력하고 Ctrl+d를 누르면 e로 시작하는 모든 명령이 나열되고, Tab을 누르면 :edit로 완성돼요.
파일명도 Tab으로 자동 완성되니까 긴 파일명을 일일이 타이핑할 필요가 없습니다.
최소한의 설정
Vim을 아무 설정 없이 쓰면 줄 번호도 없고 구문 강조도 빈약합니다. 최소한의 설정만 해두면 훨씬 쾌적해져요.
Vim의 설정 파일은 ~/.vimrc입니다.
이 파일을 만들고 아래 내용을 넣어보세요.
" 줄 번호 표시
set number
" 검색할 때 대소문자 무시 (대문자 포함 시 구분)
set ignorecase
set smartcase
" 검색 결과 하이라이트
set hlsearch
set incsearch
" 들여쓰기 설정
set tabstop=4
set shiftwidth=4
set expandtab
set autoindent
" 구문 강조
syntax on
" 현재 줄 강조
set cursorline
" 백스페이스가 정상 동작하도록
set backspace=indent,eol,start
backspace 설정은 잘 모르고 지나치기 쉬운데 중요합니다.
이걸 안 해두면 Insert 모드에서 백스페이스가 이전에 입력한 문자만 지울 수 있고 줄을 넘어서 지우거나 들여쓰기를 지우지 못하는 경우가 생겨요.
일반 편집기에서 넘어온 사람이 가장 당황하는 부분 중 하나입니다.
Vim 밖에서도 통하는 Vim
Vim을 배우면 좋은 점 중 하나는 이 편집 방식이 Vim만의 것이 아니라는 겁니다.
VS Code를 주로 쓰신다면 Vim 확장을 설치해보세요. VS Code의 모든 기능을 그대로 쓰면서 Vim 키 바인딩으로 편집할 수 있습니다. IntelliJ 계열 IDE에서는 IdeaVim이 같은 역할을 하고요. Rust로 만들어진 Zed 에디터도 Vim 모드를 기본 지원합니다.
웹 브라우저에서도 Vim 스타일로 탐색할 수 있습니다.
Chrome의 Vimium 확장을 깔면 j/k로 스크롤하고, f를 눌러서 링크를 키보드로 클릭할 수 있어요.
Vim의 모션과 편집 조합은 일종의 “텍스트 편집 언어”라서 한번 익혀두면 여러 환경에서 써먹을 수 있습니다.
초보자를 위한 생존 팁
Vim을 처음 배울 때 흔히 하는 실수와 대처법을 몇 가지 정리해봤어요.
현재 모드를 모르겠을 때: 일단 Esc를 누르세요. 몇 번이고 눌러도 괜찮습니다. Normal 모드로 확실히 돌아온 다음에 다시 시작하면 됩니다.
화면이 이상하게 변했을 때: Ctrl+z를 눌렀다면 Vim이 백그라운드로 내려간 겁니다. 터미널에서 fg를 입력하면 다시 돌아와요. 혹시 화면이 깨졌다면 :redraw!나 Ctrl+l을 눌러보세요.
한국어 입력이 안 될 때: Normal 모드에서 한국어 입력기가 켜져 있으면 명령어가 안 먹힙니다. Esc를 누른 다음 영문 입력으로 전환하고 명령어를 입력해야 해요. 꽤 번거로운 문제인데 Vim을 본격적으로 쓸 생각이라면 langmap 설정이나 im-select 같은 도구로 모드 전환 시 자동으로 영문 입력으로 바뀌게 하는 게 좋습니다.
연습이 필요할 때: Vim에는 내장 튜토리얼이 있습니다. 터미널에서 vimtutor를 실행하면 30분 정도의 인터랙티브 교육이 시작돼요. 이 글에서 다룬 내용을 직접 손으로 연습해볼 수 있으니 꼭 한번 해보세요. 웹으로 연습하고 싶다면 Vim Adventures에서 게임처럼 배울 수도 있습니다.
Vim과 NeoVim
Vim을 좀 쓰다 보면 NeoVim이라는 이름을 자주 듣게 됩니다. NeoVim은 Vim을 기반으로 2014년에 시작된 프로젝트인데 현대적인 기능이 많이 추가되어 있어요.
설정을 Lua로 작성할 수 있고 LSP(Language Server Protocol)를 기본 지원해서 자동 완성이나 코드 진단 같은 IDE급 기능을 쓸 수 있습니다. 플러그인 생태계도 활발해서 요즘 새로 나오는 플러그인은 대부분 NeoVim 전용이에요.
이 글에서 다룬 Vim의 기본 조작법은 NeoVim에서도 그대로 쓸 수 있습니다. 모드 전환, hjkl 이동, 동사+명사 조합, 검색/치환 전부 똑같아요. Vim의 기본기를 익힌 다음에 NeoVim으로 넘어가는 건 자연스러운 흐름이니까 관심이 있다면 NeoVim 입문 가이드를 읽어보세요. 거기서 한 발 더 나아가 IDE처럼 쓰고 싶다면 NvChad 가이드도 있고요.
마치며
Vim은 처음에 불친절하게 느껴지지만 그 불친절함에는 나름의 이유가 있습니다. 모드가 있기 때문에 같은 키로 이동도 하고 편집도 할 수 있고 동사+명사 조합 덕분에 적은 키 입력으로 복잡한 편집이 가능해지는 거예요.
오늘 당장 모든 걸 외울 필요는 없습니다.
i로 입력하고 Esc로 나오고 :wq로 저장하고 나가는 것.
이 세 가지면 일단 Vim에서 살아남을 수 있습니다.
거기서 하루에 명령어 하나씩 추가해 나가면 어느새 Vim이 손에 맞는 도구가 되어 있을 거예요.
이 글에서 다룬 내용을 한눈에 정리해 봤어요.
" === 종료 ===
:q " 종료
:q! " 저장하지 않고 강제 종료
:wq " 저장하고 종료
" === 이동 ===
h j k l " 좌 하 상 우
w b e " 단어 단위 이동
0 $ ^ " 줄 처음/끝/첫 글자
gg G " 파일 처음/끝
숫자 + G " 특정 줄로 이동
숫자 + 모션 " 반복 이동 (예: 3w, 5j)
" === 편집 ===
i a o O A " Insert 모드 진입
x " 글자 삭제
dw de d$ dd " 단어/줄 끝/줄 삭제
cw ce c$ cc " 지우고 입력 모드
r R " 글자 교체 / Replace 모드
yy yw y$ " 복사
p P " 붙여넣기
u Ctrl+r U " 실행 취소 / 다시 실행 / 줄 복원
. " 마지막 명령 반복
" === 검색과 치환 ===
/검색어 " 앞으로 검색
?검색어 " 뒤로 검색
n N " 다음/이전 결과
% " 괄호 짝 찾기
:s/old/new/g " 현재 줄 치환
:%s/old/new/gc " 전체 파일 치환 (확인)
" === 파일 ===
:w " 저장
:e filename " 파일 열기
:r filename " 파일 내용 삽입
:!command " 외부 명령 실행
:help " 도움말
터미널 기반 개발 환경에 관심이 있다면 Zellij도 같이 살펴보세요. Vim으로 편집하면서 Zellij로 터미널을 분할하면 마우스 없이도 쾌적하게 개발할 수 있습니다.
더 깊이 배우고 싶다면 아래 자료도 참고해 보세요.
- Vim 공식 문서
- Open Vim - 브라우저에서 바로 해보는 인터랙티브 튜토리얼
- Vim Cheat Sheet - 한글 Vim 치트시트
This work is licensed under
CC BY 4.0