본문으로 건너뛰기

Vi/Vim 단축키 가이드

· 약 15분

이 글은 Vim 단축키 시리즈의 첫 번째 글이에요.

  1. Vi/Vim 단축키 종합 가이드: 기본부터 실전까지 ← 현재 글
  2. Neovim 단축키 가이드: Vim을 넘어서는 기능들

Vim의 언어: 동사 + 명사​

Vim 단축키는 외워야 하는 목록보다 문법에 가깝습니다.

동사(operator)는 "무엇을 할 것인가":

동사의미
d삭제 (delete)
c변경 (change) — 삭제 후 Insert
y복사 (yank)
>들여쓰기
<내어쓰기
gU대문자로
gu소문자로
=자동 정렬

명사(motion/text object)는 "어디까지":

명사의미
w다음 단어까지
$줄 끝까지
gg파일 처음까지
%매칭 괄호까지
iw단어 안쪽 (inner word)
i"따옴표 안쪽
a(괄호 포함 전체

동사와 명사는 다음처럼 조합합니다.

d + iw = diw → 단어 삭제
c + i" = ci" → 따옴표 안 내용 변경
y + $ = y$ → 줄 끝까지 복사
> + ap = >ap → 문단 들여쓰기
gU + iw = gUiw → 단어 대문자로

Vim의 동사와 명사를 조합해 편집 명령을 만드는 문법

이 문법을 이해하면 수백 개의 조합을 일일이 외우지 않고 만들어낼 수 있습니다.

모드​

Vim은 모드 기반 에디터입니다. 같은 키도 모드에 따라 다르게 동작합니다.

모드진입역할
NormalEsc이동, 편집 명령 실행
Inserti, a, o 등텍스트 입력
Visualv, V, Ctrl-v영역 선택
Command-line:, /, ?명령 실행, 검색
ReplaceR덮어쓰기 입력

Insert 모드 내 단축키​

Insert 모드에서도 몇 가지 유용한 키가 있습니다.

키동작
Ctrl-w커서 앞 단어 삭제
Ctrl-u커서 앞 줄 전체 삭제
Ctrl-r "레지스터 내용 붙여넣기
Ctrl-oNormal 모드 명령 1회 실행 후 Insert 복귀
Ctrl-t들여쓰기
Ctrl-d내어쓰기

기본 이동​

k
↑
h ← → l
↓
j

숫자를 앞에 붙이면 반복합니다. 5j는 5줄 아래, 10k는 10줄 위로 이동합니다.

단어 단위 이동​

키동작
w다음 단어 시작
b이전 단어 시작
e현재/다음 단어 끝
ge이전 단어 끝
W/B/EWORD 단위 (공백 기준으로만 구분)

w와 W의 차이: hello-world에서 w는 -에서 멈추지만, W는 공백까지 건너뜁니다.

줄 안에서 이동​

키위치
0줄 맨 처음 (0번째 열)
^줄 첫 번째 글자 (공백 제외)
$줄 끝
g_줄 마지막 글자 (공백 제외)
+다음 줄 첫 글자
-이전 줄 첫 글자

문자 찾기로 이동​

줄 안에서 특정 문자로 이동하는 기능입니다. 이동뿐 아니라 동사와 조합하면 강력해집니다.

키동작
f{char}오른쪽으로 {char} 위치로 이동
F{char}왼쪽으로 {char} 위치로 이동
t{char}오른쪽으로 {char} 앞까지 이동
T{char}왼쪽으로 {char} 뒤까지 이동
;같은 방향으로 반복
,반대 방향으로 반복

실전에서 자주 쓰는 조합:

dt) → 닫는 괄호 앞까지 삭제
cf, → 쉼표까지 변경 (쉼표 포함)
yt; → 세미콜론 앞까지 복사
vf" → 따옴표까지 선택

괄호와 블록 사이 이동​

키동작
%매칭 괄호로 점프 — (↔), {↔}, [↔]
[{현재 블록의 여는 {로
]}현재 블록의 닫는 }로
[(현재 블록의 여는 (로
])현재 블록의 닫는 )로

%는 코드 읽을 때 특히 유용합니다. 긴 함수의 시작 {에서 %를 누르면 닫는 }로 바로 이동합니다.

화면과 파일 안에서 이동​

스크롤​

키동작
Ctrl-d반 페이지 아래
Ctrl-u반 페이지 위
Ctrl-f한 페이지 아래
Ctrl-b한 페이지 위

화면 내 이동​

키동작
H화면 상단 (High)
M화면 중단 (Middle)
L화면 하단 (Low)

화면 정렬​

키동작
zz현재 줄을 화면 가운데로
zt현재 줄을 화면 상단으로
zb현재 줄을 화면 하단으로

파일 내 이동​

키동작
gg파일 처음
G파일 끝
{n}Gn번째 줄로 (:42와 동일)

검색으로 이동​

키동작
/pattern아래로 검색
?pattern위로 검색
n다음 결과
N이전 결과
*커서 아래 단어를 아래로 검색
#커서 아래 단어를 위로 검색
gn다음 검색 결과를 Visual 선택
gd현재 파일에서 변수 선언으로

*와 #은 변수명 위에서 누르면 같은 이름을 바로 찾아줍니다. 검색어를 타이핑할 필요가 없습니다.

텍스트 삽입​

키위치
i커서 앞
a커서 뒤
I줄 첫 글자 앞
A줄 끝
o아래에 새 줄
O위에 새 줄
gi마지막 Insert 위치로 돌아가서 입력

gi는 편집 중 Normal로 돌아가서 다른 작업을 하다가, 다시 이전 편집 위치로 돌아갈 때 씁니다.

텍스트 삭제​

삭제(d)는 동사입니다. 명사와 조합합니다.

키동작
x커서 아래 문자
X커서 앞 문자
dw다음 단어까지
de단어 끝까지
db이전 단어까지
dd줄 전체
D = d$줄 끝까지
d0줄 처음까지
d^첫 글자까지
dG파일 끝까지
dgg파일 처음까지
diw단어 (inner)
daw단어 + 주변 공백 (around)
di"따옴표 안
di(괄호 안

텍스트 변경​

변경(c)은 삭제 후 Insert 모드로 진입합니다. d와 같은 문법을 따르며 곧바로 입력 상태가 됩니다.

키동작
cw단어 끝까지 변경
ciw단어 전체 변경
ci"따옴표 안 변경
ci(괄호 안 변경
cc줄 전체 변경
C = c$줄 끝까지 변경
s문자 하나 변경 (= cl)
S줄 전체 변경 (= cc)
r{char}커서 문자를 {char}로 교체 (Normal 유지)
RReplace 모드 진입 (타이핑이 기존 텍스트를 덮어씀)

ci"는 아마 Vim에서 가장 많이 쓰는 조합 중 하나입니다. 따옴표 안에 커서를 놓고 ci"를 누르면 안의 내용이 지워지고 바로 새 내용을 입력하게 됩니다.

복사와 붙여넣기​

키동작
yy줄 복사
yw단어 복사
y$줄 끝까지 복사
yi"따옴표 안 복사
ya(괄호 포함 전체 복사
p커서 뒤에 붙여넣기
P커서 앞에 붙여넣기
]p들여쓰기 맞춰서 붙여넣기
[p위에 들여쓰기 맞춰서 붙여넣기

자주 쓰는 조합:

조합결과
yyp현재 줄 복제
ddp현재 줄과 아래 줄 교환
xp커서 아래 두 문자 교환

줄 조작​

키동작
J현재 줄과 아래 줄 합치기 (공백 추가)
gJ줄 합치기 (공백 없이)
>>현재 줄 들여쓰기
<<현재 줄 내어쓰기
5>>5줄 들여쓰기
==현재 줄 자동 정렬
=G현재 줄부터 파일 끝까지 자동 정렬
:m+1현재 줄을 한 줄 아래로 이동
:m-2현재 줄을 한 줄 위로 이동

>> 후에 .을 누르면 한 단계씩 더 들여씁니다. 들여쓰기 레벨을 조절할 때 편리합니다.

대소문자와 숫자 편집​

키동작
~커서 아래 문자 대소문자 토글
gUiw단어 대문자로
guiw단어 소문자로
gU$줄 끝까지 대문자로
gUU줄 전체 대문자로
guu줄 전체 소문자로
Ctrl-a커서 아래(또는 뒤) 숫자 +1
Ctrl-x커서 아래(또는 뒤) 숫자 -1
5Ctrl-a숫자 +5

Ctrl-a/Ctrl-x는 코드에서 인덱스나 포트 번호를 바꿀 때 유용합니다. 커서가 숫자 위에 없어도, 같은 줄의 다음 숫자를 찾아서 변경합니다.

반복의 힘: . 명령어​

.은 마지막 편집 동작을 반복합니다. Vim에서 가장 강력한 키 중 하나입니다.

패턴 1: 검색 + 반복 치환​

1. * → 커서 아래 단어 검색
2. ciw → 단어 변경
3. 새 단어 → 입력
4. Esc → Normal 복귀
5. n → 다음 결과
6. . → 같은 변경 반복

n → . → n → .를 반복하면 원하는 것만 골라서 치환할 수 있습니다. :%s와 달리 하나씩 확인하면서 바꿀 수 있습니다.

패턴 2: 여러 줄에 같은 편집​

1. A; → 줄 끝에 세미콜론 추가
2. Esc
3. j → 다음 줄
4. . → 같은 동작 반복

패턴 3: 점진적 들여쓰기​

1. >> → 들여쓰기
2. . → 한 레벨 더
3. . → 한 레벨 더

.과 잘 어울리는 명령어​

명령어.으로 반복하면
ciw + 입력다른 단어를 같은 내용으로 변경
A;줄 끝에 세미콜론 추가
I// 줄 앞에 주석 추가
dd줄 삭제
>>들여쓰기
r{char}문자 교체

텍스트 오브젝트​

i(inner)는 안쪽만, a(around)는 주변 공백이나 구분자를 포함합니다.

오브젝트inner (i)around (a)대상
단어iwawword
WORDiWaWWORD (공백 구분)
문장isassentence
문단ipapparagraph
"i"a""큰따옴표"
'i'a''작은따옴표'
`i`a``백틱`
( / )i(a((소괄호)
{ / }i{a{{중괄호}
[ / ]i[a[[대괄호]
< / >i<a<<꺾쇠>
태그itatHTML 태그

실전 조합:

ciw → 단어 내용 변경
da" → 따옴표 포함 삭제
vi( → 괄호 안 Visual 선택
yat → HTML 태그 전체 복사
>ip → 현재 문단 들여쓰기
gUiw → 단어 대문자로

Visual 모드 기본​

세 가지 Visual 모드​

키모드선택 단위
vVisual문자 단위
VVisual Line줄 단위
Ctrl-vVisual Block사각형 블록

선택 확장​

키동작
o선택 영역의 양 끝을 토글 (시작↔끝 커서 이동)
OVisual Block에서 같은 줄의 반대쪽 모서리로

o는 선택을 시작한 후 반대 방향으로도 확장하고 싶을 때 씁니다.

모드 전환​

선택을 유지한 채 모드를 바꿉니다. v → V로 문자에서 줄로, V → Ctrl-v로 줄에서 블록으로 바뀝니다.

재선택​

키동작
gv마지막 Visual 선택 영역을 다시 선택

>로 들여쓰기 후 gv로 재선택하면 한 번 더 들여씁니다. gv → > → gv → > 순서입니다.

선택 + 모션​

조합결과
v2w2단어 선택
vit태그 안 선택
vi{중괄호 안 선택
vap문단 선택
v$줄 끝까지 선택

Visual 모드에서 선택 영역 조작​

영역을 선택한 후 다음 명령을 사용합니다.

기본 조작​

키동작
d삭제
c변경 (삭제 후 Insert)
y복사

들여쓰기​

키동작
>한 레벨 들여쓰기
<한 레벨 내어쓰기
3>3레벨 들여쓰기

V로 여러 줄을 선택하고 >를 누르면 한꺼번에 들여씁니다. .으로 반복됩니다.

대소문자​

키동작
~대소문자 토글
U전부 대문자
u전부 소문자

정렬과 외부 명령​

키동작
=자동 정렬 (indentation)
J선택한 줄 합치기
!sort선택 영역을 알파벳 정렬
!sort -n숫자 정렬
!column -t컬럼 정렬 (표 형태)

ex 명령​

선택 후 :를 누르면 :'<,'>가 자동 입력됩니다. 선택 범위에 ex 명령을 적용합니다.

:'<,'>s/old/new/g " 선택 영역에서 치환
:'<,'>normal A; " 선택한 모든 줄 끝에 ; 추가
:'<,'>normal I// " 선택한 모든 줄 앞에 // 추가

컬럼 편집 심화 (Visual Block)​

Ctrl-v로 진입하는 Visual Block 모드는 사각형 영역을 선택합니다. 일반 에디터의 "멀티 커서"와 비슷한 결과를 만들 수 있습니다.

컬럼 선택​

Ctrl-v → Visual Block 진입
j/k → 위아래 행 확장
l/h → 좌우 열 확장
$ → 각 줄 끝까지 (줄 길이 달라도 OK)

다중 행 앞에 삽입​

여러 줄 앞에 동시에 텍스트를 넣습니다.

1. Ctrl-v → Visual Block 진입
2. jjj → 4줄 선택
3. I → 맨 앞에 Insert
4. // (스페이스) → 입력
5. Esc → 모든 줄에 적용

예: 주석 추가

실행 전: 실행 후:
let a = 1 // let a = 1
let b = 2 // let b = 2
let c = 3 // let c = 3
let d = 4 // let d = 4

다중 행 끝에 추가​

1. Ctrl-v → Visual Block 진입
2. jjj → 4줄 선택
3. $ → 각 줄 끝까지 (길이 달라도 OK)
4. A → 끝에 Append
5. ; → 입력
6. Esc → 모든 줄에 적용

컬럼 삭제​

선택한 사각형 영역을 통째로 삭제합니다.

1. Ctrl-v → Visual Block 진입
2. jjj → 행 선택
3. ll → 열 확장
4. d → 삭제

예: 들여쓰기 일괄 제거

실행 전: 실행 후:
line 1 line 1
line 2 line 2
line 3 line 3

4칸 공백 위치에 Ctrl-v → jj → lll → d.

예: 주석 일괄 제거

실행 전: 실행 후:
// let a = 1 let a = 1
// let b = 2 let b = 2
// let c = 3 let c = 3

// 위에 Ctrl-v → jj → ll → d.

컬럼 치환​

선택한 사각형 영역을 새로운 텍스트로 교체합니다.

1. Ctrl-v → Visual Block 진입
2. jjj → 행 선택
3. e → 단어 끝까지 열 확장
4. c → 변경
5. newText → 새 텍스트 입력
6. Esc → 모든 줄에 적용

컬럼 문자 교체​

선택 영역의 모든 문자를 같은 문자로 바꿉니다.

1. Ctrl-v → 블록 선택
2. r- → 모든 문자를 -로 교체

구분선을 만들거나, 공백을 특정 문자로 채울 때 유용합니다.

컬럼 들여쓰기​

1. Ctrl-v → Visual Block 진입
2. jjj → 행 선택
3. > → 들여쓰기
4. gv → 재선택
5. > → 한 레벨 더

또는 V → jjj → 3>로 3레벨 한 번에 들여쓰기.

컬럼 대소문자​

Ctrl-v → 영역 선택 → ~ (토글)
Ctrl-v → 영역 선택 → U (대문자)
Ctrl-v → 영역 선택 → u (소문자)

순차 번호 매기기​

g Ctrl-a는 Visual Block으로 선택한 숫자들을 순차적으로 증가시킵니다.

실행 전 (모두 0): 실행 후:
0. item 1. item
0. item 2. item
0. item 3. item
0. item 4. item

방법: Ctrl-v → jjj (0들을 선택) → g Ctrl-a.

실전 예제 모음​

상황방법
여러 줄 앞에 // 주석Ctrl-v → jjj → I → // → Esc
여러 줄 // 주석 제거Ctrl-v → jjj → ll → d
여러 줄 끝에 ; 추가Ctrl-v → jjj → $ → A → ; → Esc
CSV 특정 컬럼 삭제해당 열에 Ctrl-v → G → d
변수명 일괄 교체해당 열에 Ctrl-v → jjj → e → c → 새 이름 → Esc
여러 줄 들여쓰기Ctrl-v → jjj → > (또는 V → jjj → >)
0부터 순차 번호0을 입력 → 복사해서 여러 줄 → Ctrl-v로 선택 → g Ctrl-a
HTML 속성 일괄 추가태그 뒤에 Ctrl-v → jjj → A → class="new" → Esc

검색과 치환​

검색​

키동작
/pattern아래 방향 검색
?pattern위 방향 검색
n다음 결과
N이전 결과
*커서 아래 단어 검색 (아래로)
#커서 아래 단어 검색 (위로)

치환​

:s/old/new/ " 현재 줄, 첫 번째만
:s/old/new/g " 현재 줄, 전체
:%s/old/new/g " 파일 전체
:%s/old/new/gc " 파일 전체, 하나씩 확인
:'<,'>s/old/new/g " Visual 선택 영역
:5,20s/old/new/g " 5~20번째 줄

정규식 기초​

패턴의미
.아무 문자 1개
.*아무 문자 0개 이상
\d숫자
\w영문/숫자/밑줄
\s공백
^줄 시작
$줄 끝
\(\)캡처 그룹
\1첫 번째 캡처 역참조

예: 순서 뒤집기

:%s/\(\w\+\), \(\w\+\)/\2, \1/g
" "Kim, John" → "John, Kim"

다중 줄 일괄 편집 (ex 명령)​

특정 줄 범위나 패턴에 매칭되는 줄에 일괄 명령을 적용합니다.

줄 범위 조작​

명령동작
:5,20d5~20줄 삭제
:5,20y5~20줄 복사
:10,20m3010~20줄을 30줄 뒤로 이동
:10,20co3010~20줄을 30줄 뒤에 복사

:g (global)로 패턴 매칭 일괄 실행​

:g/pattern/d " pattern 포함 줄 전부 삭제
:v/pattern/d " pattern 미포함 줄 전부 삭제 (v = inverse)
:g/TODO/normal A; " TODO 포함 줄 끝에 ; 추가
:g/^$/d " 빈 줄 전부 삭제
:g/console.log/d " console.log 줄 전부 삭제

:normal로 줄 범위에 Normal 명령 적용​

:5,20normal >> " 5~20줄 들여쓰기
:5,20normal I// " 5~20줄 앞에 // 추가
:5,20normal A; " 5~20줄 끝에 ; 추가
:5,20normal dd " 5~20줄 삭제

:g와 :normal을 조합하면 Vim 안에서 거의 모든 일괄 편집이 가능합니다.

매크로​

매크로는 키 입력을 녹화하고 재생하는 기능입니다.

기본 사용법​

1. qa → a 레지스터에 녹화 시작
2. (편집 동작) → 원하는 작업 수행
3. q → 녹화 종료
4. @a → 매크로 실행
5. @@ → 마지막 매크로 반복
6. 10@a → 10회 반복 실행

실전 예제: CSV를 SQL INSERT로 변환​

원본:

John,30,Seoul
Jane,25,Busan

변환 결과:

INSERT INTO users VALUES ('John', 30, 'Seoul');
INSERT INTO users VALUES ('Jane', 25, 'Busan');

첫 줄에서 매크로를 녹화하고, 나머지 줄에 @a로 적용하면 됩니다.

재귀 매크로​

매크로 안에서 자기 자신을 호출할 수도 있습니다.

qaq → a 레지스터 초기화
qa → 녹화 시작
(편집 동작)
j → 다음 줄
@a → 자기 자신 호출
q → 녹화 종료
@a → 실행 (파일 끝까지 반복)

파일 끝에 도달하면 j가 실패해서 자동으로 멈춥니다.

레지스터​

Vim은 삭제하거나 복사한 텍스트를 여러 레지스터에 저장합니다.

레지스터이름용도
""무명마지막 d/c/y 결과
"0yank마지막 y 결과만 (d/c 제외)
"1~"9숫자최근 삭제 이력
"+시스템 클립보드OS 복사/붙여넣기
"a~"z이름 지정사용자 지정 저장
"A~"Z이름 추가기존 레지스터에 추가(append)
"_블랙홀삭제해도 어디에도 저장 안 됨
"/검색마지막 검색 패턴
":명령마지막 ex 명령
".입력마지막 Insert 입력

사용법​

"ay → a 레지스터에 복사
"ap → a 레지스터에서 붙여넣기
"+y → 시스템 클립보드에 복사
"+p → 시스템 클립보드에서 붙여넣기
"_dd → 줄 삭제하되 레지스터 건드리지 않기
:reg → 모든 레지스터 확인

"0이 유용한 상황: yy로 복사한 후 dd로 다른 줄을 삭제하면, p는 삭제한 줄을 붙여넣습니다. 원래 복사한 줄을 붙여넣으려면 "0p.

마크​

파일 내 위치를 북마크처럼 저장합니다.

키동작
m{a-z}현재 위치를 로컬 마크로 저장
m{A-Z}현재 위치를 글로벌 마크로 저장 (파일 간 이동 가능)
`a마크 a의 정확한 위치로 이동
'a마크 a가 있는 줄의 처음으로 이동
:marks마크 목록 보기

자동 마크​

Vim이 자동으로 설정하는 마크:

마크위치
`.마지막 편집 위치
`"마지막으로 파일을 닫았던 위치
`[마지막 변경/붙여넣기 시작
`]마지막 변경/붙여넣기 끝
''마지막 점프 이전 위치

''(작은따옴표 두 번)는 "아까 있던 곳으로 돌아가기"입니다. 검색이나 G로 이동한 후 원래 위치로 돌아갈 때 씁니다.

윈도우/버퍼/탭​

버퍼​

열려 있는 파일 목록입니다.

명령동작
:e file파일 열기
:ls열린 버퍼 목록
:bn / :bp다음 / 이전 버퍼
:bd현재 버퍼 닫기
:b{n}n번 버퍼로 이동
:b name이름으로 버퍼 이동 (탭 자동완성)

윈도우​

화면을 분할해서 여러 파일을 동시에 봅니다.

명령동작
:split / :sp가로 분할
:vsplit / :vs세로 분할
Ctrl-w h/j/k/l윈도우 간 이동
Ctrl-w =크기 동일하게
Ctrl-w o현재 윈도우만 남기고 닫기
Ctrl-w > / <너비 조절
Ctrl-w + / -높이 조절
Ctrl-w r윈도우 위치 회전

탭​

명령동작
:tabnew새 탭
gt / gT다음 / 이전 탭
:tabclose탭 닫기
{n}gtn번 탭으로 이동

접기 (Folding)​

코드의 일부를 접어서 숨깁니다.

키동작
zf{motion}접기 생성 (예: zfap 문단 접기)
za접기 토글
zo접기 열기
zc접기 닫기
zR전체 열기
zM전체 닫기
zj다음 접기로 이동
zk이전 접기로 이동

실전 편집 레시피​

"이걸 하고 싶은데 어떻게 하지?"라는 상황에 맞춘 단축키 조합입니다.

하고 싶은 것방법
이 단어를 전부 바꾸고 싶다* → ciw → 새 단어 → Esc → n → . 반복
여러 줄 앞에 주석 추가Ctrl-v → jjj → I → // → Esc
여러 줄 주석 제거Ctrl-v → jjj → ll → d
괄호 안 내용만 교체ci(
따옴표 안 내용 복사yi"
태그 안 내용 삭제dit
현재 줄 복제yyp
두 줄 순서 바꾸기ddp
여러 줄 들여쓰기V → jjj → > (반복: .)
여러 줄 내어쓰기V → jjj → <
선택 영역 정렬V → 선택 → !sort
단어를 대문자로gUiw
줄 전체 대문자로gUU
0~N 순차 번호 매기기0 여러 줄 → Ctrl-v로 선택 → g Ctrl-a
함수 블록 전체 복사여는 {에서 V → % → y
빈 줄 전부 삭제:g/^$/d
TODO 줄만 남기기:v/TODO/d
console.log 전부 삭제:g/console.log/d
5~20줄에 주석 추가:5,20normal I//

마치며​

이 글에서 다룬 것은 모두 Vim과 Neovim에서 공통으로 동작하는 단축키예요.

기억할 것은 세 가지예요.

  1. 동사 + 명사 조합의 문법을 이해해 암기량 줄이기
  2. .을 습관화해 반복 가능한 편집으로 생산성 높이기
  3. Visual Block을 익혀 멀티 커서 없이 다중 행 편집하기

다음 글에서는 LSP, 터미널, 플러그인, 마우스 활용까지 Neovim만의 단축키를 다뤄요.