빔(vim) 기본 사용법, 입력·저장·종료부터 바꾸기까지 직접 해 보니
빔(vim)에 키를 파일로 넣어 입력, 저장, 종료, 줄 삭제, 복사, 찾기, 바꾸기를 하나씩 실행하고 파일이 어떻게 바뀌는지 확인했습니다. 편집 단계는 모두 0.0초에 끝났고, Claude Code에게 받은 키를 넣어 보는 단계는 10.7초가 걸렸습니다.
Finn ·

빔(vim)을 처음 열면 글자가 써지지 않거나, 빠져나가는 방법을 몰라 터미널 창을 통째로 닫는 일이 생기곤 하죠. macOS에 들어 있는 vim 9.1에 Go넷째 줄<Esc>:wq라는 키를 넣으면 세 줄짜리 memo.txt 끝에 '넷째 줄'이 붙고, 저장된 뒤 편집기가 닫힙니다. 입력부터 바꾸기, 다른 이름으로 저장까지 각 단계는 모두 0.0초에 끝났습니다. Claude Code에게 키 묶음을 받아 넣어 본 단계는 10.7초가 걸렸습니다.
글을 쓰고 저장하고 나가는 기본 순서
vim은 모드가 나뉜 편집기입니다. 처음 켜면 일반(Normal) 모드인데, 여기서 누르는 글자는 글이 아니라 명령으로 처리돼요. 그래서 i를 눌러 입력(Insert) 모드에 들어가야 글자가 파일에 들어가고, 다 쓴 뒤에는 <Esc>로 일반 모드에 돌아옵니다.
저장하고 끝낼 때는 일반 모드에서 :wq를 치고 Enter를 누릅니다. 바꾼 것을 버리고 나가려면 :q!를 칩니다. 실제로 줄 두 개를 지운 뒤 :q!로 나가 보면 파일은 지우기 전과 똑같이 남아 있었습니다.
지금 어느 모드인지 헷갈린다면 어떻게 할까요? vim 사용자 설명서 2장은 어느 모드에 있든 <Esc>를 누르면 일반 모드로 돌아온다고 설명합니다. 가끔은 두 번 눌러야 하고, 삑 소리가 나면 이미 일반 모드라는 뜻이에요.

함께 읽을 글
이번 실행은 어떤 조건이었나요?
키는 사람이 치는 대신 keys.txt 파일에 적어 vim -s로 읽혀 넣었습니다. 개인 설정(.vimrc)과 기록 파일은 -N -u NONE -i NONE -n으로 끄고 실행했어요. 그리고 화면 대신 실행 뒤의 파일 내용을 cat -n으로 확인했습니다.
printf 문자열의 \033과 \r은 각각 실제 Esc와 Enter 문자로 변환되어 keys.txt에 저장됩니다. 키 파일에 이 표기를 글자로 그대로 적는 것은 아닙니다. 눈으로 보이게 하려고 perl로 각각 <Esc>, <Enter>로 바꿔 한 번 출력한 뒤 vim을 실행했죠. 예를 들어 줄을 하나 추가하는 단계는 이렇게 실행합니다.
$ printf 'Go넷째 줄\033:wq\n' > keys.txt && perl -pe 's/\e/<Esc>/g; s/\r/<Enter>/g' keys.txt && vim -N -u NONE -i NONE -n -s keys.txt memo.txt >/dev/null 2>&1; cat -n memo.txt
Go넷째 줄<Esc>:wq
1 첫째 줄
2 둘째 줄
3 셋째 줄
4 넷째 줄AI 에이전트에게 서버 파일 수정을 맡기고 있다면 이 방식이 쓸모 있습니다. 키를 파일로 남기고 결과를 cat -n이나 diff로 확인하면, 무엇을 눌렀고 무엇이 바뀌었는지 기록이 그대로 남으니까요.

글자와 새 줄을 넣는 키
위 예시의 G는 마지막 줄로 가는 키이고, o는 커서 아래에 빈 줄을 만들면서 입력 모드로 들어갑니다. 줄 중간에 넣을 때는 i가 커서 앞에, a가 커서 뒤에 글자를 넣어요. 빠른 참조에 따르면 대문자 A는 줄 끝에 이어 씁니다.
첫 줄 앞에 '[메모] '를, 끝에 ' (끝)'을 붙이는 키를 넣으면 이렇게 바뀝니다.
ggi[메모] <Esc>A (끝)<Esc>:wq
1 [메모] 첫째 줄 (끝)
2 둘째 줄
3 셋째 줄
4 넷째 줄입력이 끝날 때마다 <Esc>가 들어간 것을 눈여겨보세요. A도 일반 모드에서 쳐야 명령으로 처리되기 때문입니다.
저장하지 않고 나가면 어떻게 되나요?
dd를 두 번 눌러 맨 위 두 줄을 지운 다음 :q!로 나가 봤습니다. 파일은 그대로였어요.
ggdddd:q!
1 [메모] 첫째 줄 (끝)
2 둘째 줄
3 셋째 줄
4 넷째 줄그런데 ! 없이 :q만 치면 어떻게 될까요? 설명서에 따르면 바꾼 내용이 있을 때 vim은 E37: No write since last change (use ! to override) 오류를 띄우고 닫히지 않습니다. 편집을 계속하면서 원래 파일로 되돌리고 싶다면 :e!를 쓰면 됩니다. 저장하고 끝내는 ZZ도 있지만, vim은 백업 파일을 저절로 만들지 않아서 한 번 저장하면 되돌릴 길이 없다는 점은 알아 두세요.
줄을 지우고 되돌리는 방법
dd는 줄 전체를 지우고, 그 아래 줄이 올라와 빈자리를 채웁니다. 2G로 둘째 줄에 가서 지우면 이렇게 됩니다.
2Gdd:wq
1 [메모] 첫째 줄 (끝)
2 셋째 줄
3 넷째 줄u는 마지막 편집을 되돌립니다. 저장 전 파일을 before.txt로 복사해 두고 2Gddu:wq를 넣은 뒤 diff로 비교해 보면, 차이가 없다는 메시지만 나옵니다.
2Gddu:wq
1 [메모] 첫째 줄 (끝)
2 셋째 줄
3 넷째 줄
dd 다음 u: 파일이 그대로너무 많이 되돌렸다면 CTRL-R로 되돌리기를 취소할 수 있습니다.
줄을 복사해서 붙여넣는 방법
yy는 줄을 레지스터(register)라는 임시 저장 칸에 복사하고, p는 그 내용을 커서 뒤에 붙입니다. 첫 줄을 복사해 마지막 줄 아래에 붙이면 이렇습니다.
ggyyGp:wq
1 [메모] 첫째 줄 (끝)
2 셋째 줄
3 넷째 줄
4 [메모] 첫째 줄 (끝)찾은 줄로 가서 고치는 방법
/ 뒤에 찾을 말을 쓰고 Enter를 누르면 앞쪽으로 그 말이 나오는 곳까지 갑니다. 다음 결과로 넘어갈 때는 n, 반대 방향은 N입니다. '넷째'를 찾아 그 줄 끝에 글을 붙여 보면 이렇게 됩니다.
gg/넷째<Enter>A ← 찾은 줄<Esc>:wq
1 [메모] 첫째 줄 (끝)
2 셋째 줄
3 넷째 줄 ← 찾은 줄
4 [메모] 첫째 줄 (끝)파일 전체 글자를 한 번에 바꾸는 방법
바꾸기 명령의 형식은 :[range]s[ubstitute]/{pattern}/{string}/[g][c]입니다. 끝의 g는 한 줄 안에 나오는 것을 모두 바꾸고, c는 하나씩 확인받습니다. 범위 자리에 %를 넣은 :%s/줄/행/g를 실행해 봤어요. 키 파일을 만들 때 printf에서는 %를 %%로 적었습니다.
:%s/줄/행/g<Enter>:wq
1 [메모] 첫째 행 (끝)
2 셋째 행
3 넷째 행 ← 찾은 행
4 [메모] 첫째 행 (끝)네 줄이 모두 바뀌었고, '줄'이 두 번 나온 셋째 줄도 두 곳 다 '행'이 됐습니다. AI가 만든 코드에서 이름 하나를 일괄로 고칠 때 쓸 수 있는데, 바꿀 말이 다른 단어 안에도 들어 있지는 않은지 먼저 /로 찾아보는 편이 안전합니다.
원하는 줄로 바로 가는 방법
gg는 첫 줄로, G는 마지막 줄로 갑니다. 앞에 숫자를 붙이면 그 번호의 줄로 가고요(2G처럼). 콜론 명령 :3을 쳐도 셋째 줄로 갑니다. 셋째 줄로 가서 지워 보면 이렇습니다.
:3<Enter>dd:wq
1 [메모] 첫째 행 (끝)
2 셋째 행
3 [메모] 첫째 행 (끝)여기까지 같은 memo.txt 한 개가 단계마다 어떻게 바뀌었는지 이어서 보면 키 하나하나의 효과가 더 잘 보입니다.

다른 이름으로 저장하는 방법
:w 뒤에 파일 이름을 붙이면 지금 내용을 그 이름으로 저장합니다. 이 단계는 :q로 끝냈고, 두 파일을 diff로 비교했습니다.
$ printf ':w copy.txt\r:q\n' > keys.txt && vim -N -u NONE -i NONE -n -s keys.txt memo.txt >/dev/null 2>&1; ls *.txt && diff memo.txt copy.txt && echo '두 파일 내용 같음'
before.txt
copy.txt
keys.txt
memo.txt
두 파일 내용 같음AI가 만든 키 묶음도 그대로 통할까요?
마지막으로 Claude Code 2.1.309(--model opus)에게 모든 줄을 가나다순으로 정렬하고 저장해서 끝내는 키를 한 줄로 달라고 했습니다. 받은 답을 그대로 list.txt(다, 가, 나 순서)에 넣은 결과는 이렇습니다.
:sort\r:wq\r
1 가
2 나
3 다이 단계에 걸린 10.7초는 요청을 보내고, 답을 받아 vim에 넣고, 결과를 확인하기까지 단계 전체의 시간입니다. 또 한 번 받아 본 답이라 매번 같은 키가 나온다고 말할 수는 없어요. 그래서 AI에게 키를 받아 쓰려면 이번처럼 연습 파일에 먼저 넣고 cat -n으로 확인한 뒤 실제 파일에 쓰는 순서가 맞습니다.
측정 조건과 한계
- 환경: darwin arm64, macOS에 들어 있는
VIM - Vi IMproved 9.1, Node.js v22.23.1 - 방법: 새 임시 폴더에서 각 단계를 한 번씩 실행했고, 모든 단계의 종료 코드는 0이었습니다
- 키는
vim -s로 넣었고 개인 설정은 껐습니다. 평소처럼.vimrc를 쓰는 환경에서는 결과가 다를 수 있습니다 - 화면이 아니라 실행 뒤 파일 내용만 확인했으므로 모드 표시나 오류 메시지가 화면에 어떻게 보이는지는 재지 않았습니다
- 함께 많이 찾는 네오빔(Neovim)은 실행하지 않았습니다. 같은 키가 그대로 통하는지는 이 기록만으로 말할 수 없습니다
더 궁금한 키는 vim 안에서 :help x처럼 :help 뒤에 주제를 붙여 찾을 수 있습니다. 설명서는 이 도움말이 지금 쓰는 vim 버전에 맞춰져 있다는 점을 장점으로 꼽습니다.
참고 자료
- vimhelp.org/usr_02.txt.html vimhelp.org
- N # search backward for the identifier under the cursor vimhelp.org