Vim/Vi 키 치트시트

주로 쓰는 편집(복사/잘라내기/덮어쓰기) + 라인번호 범위 명령. VSCode Vim에서도 거의 동일하게 동작합니다.

모드 요약

모드 설명 진입/종료
Normal 노멀 모드 명령을 내리는 기본 상태 Esc 로 언제든 복귀
Insert 입력 모드 텍스트 입력 i, a, o / 종료: Esc
Visual 비주얼 모드 선택(드래그) 후 작업 v(문자), V(라인), Ctrl+v(블록) / 종료: Esc
Command 콜론 모드 :50,54y 같은 범위 명령 실행 : / 종료: Esc

“복사/잘라내기/변경”은 주로 노멀 모드에서 operator + motion 또는 text object로 실행합니다.

복사 (Yank)

명령 설명 예시
yy 현재 줄 복사 yy
5yy 현재 줄부터 5줄 복사 5yy
y + 이동 이동(motion) 범위 복사 y$(커서~줄끝), yw(단어)
v 선택 → y 비주얼 선택 영역 복사 v ... y
V 선택 → y 라인 단위 선택 복사 V 4j y (총 5줄)

VSCode Vim에서 보통 y만 해도 OS 클립보드와 연동되지만, 환경에 따라 다르면 시스템 레지스터 "+를 쓰면 확실합니다.

잘라내기 (Cut) = Delete (d)

Vim에서는 “잘라내기”라는 별도 키가 아니라, 삭제(delete)한 내용이 레지스터에 저장되므로 이후 p/P로 붙여넣을 수 있습니다.

명령 설명 예시
dd 현재 줄 잘라내기(삭제+저장) dd
5dd 현재 줄부터 5줄 잘라내기 5dd
dw 커서부터 “단어 경계”까지 삭제 dw
diw 단어 전체(inner word) 삭제 diw
d$ 커서부터 줄 끝까지 삭제 d$
v 선택 → d 선택 영역 잘라내기 v ... d
Ctrl+v 선택 → d 블록(컬럼) 단위 삭제 Ctrl+v ... d

붙여넣기 (Paste)

명령 설명 예시
p 커서 에 붙여넣기 p
P 커서 에 붙여넣기 P
gp 붙여넣기 후 커서를 붙여넣은 뒤에 둠(취향) gp

덮어쓰기/변경 (Change & Replace)

단어를 “통째로” 바꾸기

명령 설명
ciw 현재 단어 전체 변경 (change inner word) → insert 진입
caw 단어 + 주변 공백까지 변경 (change a word)
viwc 단어 선택 후 변경(결과는 ciw와 유사)

“단어 전체를 깔끔하게 덮어쓰기”는 보통 ciw가 가장 안정적입니다.

커서부터 단어 끝까지 바꾸기

명령 설명
cw 커서~단어 끝까지 변경 (UI에서 단어 끝이 강조되어 보일 수 있음)
ce 커서~단어 끝(정확히 end)까지 변경

질문에서 말한 “resolve$처럼 보이며 덮어쓰기”는 보통 cw/ce 또는 검색 기반(cgn)에서 많이 체감됩니다.

Windows ‘수정(덮어쓰기)’ 느낌의 Replace 모드

명령 설명 종료
R Replace 모드(타이핑이 기존 글자를 덮어씀) Esc
r 현재 커서의 한 글자만 다른 글자로 교체 즉시 종료

라인번호 범위로 복사/삭제 (콜론 명령)

라인 넘버가 명확할 때 가장 빠릅니다. (예: 50번 줄부터 5줄)

명령 설명 예시
:50,54y 50~54줄(총 5줄) 복사(yank) :50,54y
:50,54d 50~54줄 삭제(잘라내기) :50,54d
:50 50번 줄로 이동 :50
예) “50번 줄부터 5줄 복사”
:50,54y

예) “50번 줄로 이동한 다음 5줄 복사”
:50
5yy

페이지/전체 삭제

Vim에서 “페이지”는 보통 화면에 보이는 영역(screenful)을 뜻합니다. 아래는 자주 쓰는 “전체 삭제” 케이스를 의미별로 정리한 것입니다.

목표 명령 설명
파일 전체 삭제 :%d 파일의 모든 줄 삭제. 가장 확실한 “전체 삭제” 방법. 삭제 후 u로 되돌릴 수 있음.
파일 전체 삭제(키보드) ggVGd gg(맨 위) → V(라인 선택) → G(맨 아래) → d(삭제).
현재 줄~파일 끝 삭제 dG 커서가 있는 줄부터 파일 끝까지 삭제.
현재 화면(페이지)만 삭제 V → (선택 이동) → d 단일 “한 방” 명령은 없고, 라인 비주얼 모드(V)로 화면에 보이는 만큼 선택 후 d로 삭제.
자주 쓰는 조합

" 1) 파일 전체 삭제
:%d

" 2) 파일 전체 삭제(키보드만)
ggVGd

" 3) 현재 줄부터 파일 끝까지 삭제
dG

“페이지(screenful) 삭제”는 화면 범위가 스크롤/창 크기에 의해 달라지므로, 보통 V로 선택 후 d 방식이 가장 안전합니다.

검색 기반 교체 (단어가 “선택된 것처럼” 보이는 패턴)

/로 검색하고, 매치된 단어가 선택된 것처럼 보이면서 덮어쓰기”를 가장 잘 재현하는 조합입니다.

명령 설명 비고
/패턴 검색 (다음: n, 이전: N) /resolve
cgn 현재/다음 검색 매치를 “변경(change)”하고 insert 진입 연속 교체에 매우 빠름
. 직전 변경/삭제 명령 반복 반복 치환에 핵심
:%s/old/new/gc 전체 치환 + 확인(prompt)하며 진행 c는 confirm
예) resolve 를 하나씩 눈으로 확인하며 바꾸기
/resolve
cgn   (새 텍스트 입력 후 Esc)
n     (다음 매치로 이동)
.     (반복)  또는 다시 cgn

예) 파일 전체에서 old -> new 치환(확인하면서)
:%s/old/new/gc

실전 팁

이 페이지는 “필요한 것만 빠르게 찾는” 용도로 구성했습니다. 더 넣고 싶은 섹션(이동, 검색/치환 심화, 레지스터, 매크로 등) 있으면 말해주면 확장해드릴게요.

정규표현식에서 %는 특별한가?

결론부터: 일반적인 정규표현식(regex)에서 %는 메타문자가 아니다. 대부분의 엔진에서 %는 그냥 문자(literal)로 취급된다. 다만 Vim에서는 “정규식”이 아닌 “콜론 명령 문법”에서 %가 특별한 의미로 쓰여 혼동이 자주 발생한다.

1) 표준 정규표현식(Regex)에서 %

표현 의미 비고
% % 문자 1개를 그대로 매칭 대부분 엔진에서 이스케이프 불필요
100% 100% 문자열 그대로 매칭 예: "100%" 포함 여부 검사
예) "100%"가 포함되어 있는지 찾기 (일반 regex 관점)
100%

2) Vim에서 헷갈리는 이유: :%d%는 정규식이 아님

:%d는 정규식이 아니라 Ex(콜론) 명령이다. 여기서 %전체 줄 범위(= 1,$)를 의미한다.

명령 해석
:%d 파일 전체 삭제 %(전체 줄 범위) + d(delete)
:%s/foo/bar/g 파일 전체에서 치환 %(전체 줄 범위) + s(substitute)
예) Vim 콜론 명령 (정규식 아님)
:%d              " 전체 줄(1,$) 삭제
:%s/old/new/g    " 전체 줄(1,$)에서 old -> new 치환

3) Vim 정규식에서 %는?

Vim 정규식에서도 % 자체는 보통 메타문자가 아니다(그냥 문자로 매칭됨). 다만 Vim에는 \%로 시작하는 “Vim 전용 확장 정규식”이 존재한다. 이 경우는 % 단독이 아니라 \% 접두사가 핵심이다.

패턴 의미(개념) 예시
\%l 특정 줄(line)에 위치 조건을 건다 /\%5lERROR (5번째 줄의 ERROR)
\%c 특정 컬럼(column)에 위치 조건을 건다 /\%10cfoo (10번째 컬럼의 foo)
\%d 숫자(digit) 등 Vim 확장 패턴(버전에 따라 차이) Vim 도움말 참고
예) Vim 확장 정규식 (Vim 전용)
:/\%5lERROR   " 5번째 줄에 있는 ERROR만 매칭

요약