이 글은 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은 모드 기반 에디터다. 같은 키가 모드에 따라 다르게 동작한다.

모드진입역할
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 단위 (공백 기준으로만 구분)

wW의 차이: 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는 선택을 시작한 후 반대 방향으로도 확장하고 싶을 때 쓴다.

모드 전환

선택을 유지한 채 모드를 바꿀 수 있다: vV (문자→줄), VCtrl-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-vjjllld.

예: 주석 일괄 제거

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

// 위에 Ctrl-vjjlld.

컬럼 치환

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

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. >            → 한 레벨 더

또는 Vjjj3>로 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-vjjj (0들을 선택) → g Ctrl-a.

실전 예제 모음

상황방법
여러 줄 앞에 // 주석Ctrl-vjjjI// Esc
여러 줄 // 주석 제거Ctrl-vjjjlld
여러 줄 끝에 ; 추가Ctrl-vjjj$A;Esc
CSV 특정 컬럼 삭제해당 열에 Ctrl-vGd
변수명 일괄 교체해당 열에 Ctrl-vjjjec → 새 이름 → Esc
여러 줄 들여쓰기Ctrl-vjjj> (또는 Vjjj>)
0부터 순차 번호0을 입력 → 복사해서 여러 줄 → Ctrl-v로 선택 → g Ctrl-a
HTML 속성 일괄 추가태그 뒤에 Ctrl-vjjjAclass="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-vjjjI// → Esc
여러 줄 주석 제거Ctrl-vjjjlld
괄호 안 내용만 교체ci(
따옴표 안 내용 복사yi"
태그 안 내용 삭제dit
현재 줄 복제yyp
두 줄 순서 바꾸기ddp
여러 줄 들여쓰기Vjjj> (반복: .)
여러 줄 내어쓰기Vjjj<
선택 영역 정렬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//

마치며

이 글에서 다룬 것은 모두 Vi/Vim에서 동작하는 보편적인 단축키다. Neovim, Vim, Vi 어디서든 쓸 수 있다.

핵심은 세 가지:

  1. 문법을 이해하라 — 동사 + 명사 조합을 알면 암기량이 줄어든다
  2. .을 습관화하라 — 반복 가능한 편집을 만들면 생산성이 올라간다
  3. Visual Block을 익혀라 — 멀티 커서 없이도 다중 행 편집이 가능하다

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