Vim에서 기억해 둘 명령과 사용법

MIT Missing Semester의 Editors (Vim) 강의를 보고 Vim 명령을 정리했습니다. 명령만 하나씩 외우기보다는 짧은 문장을 직접 고쳐 보는 편이 이해하기 쉽습니다. 여기서는 one two를 입력한 뒤 커서를 옮기고 수정해 보겠습니다.

글자를 입력하고 저장하기

터미널에서 다음 명령으로 연습용 파일을 엽니다.

Open a practice file

vim practice.txt

Vim에서 파일을 열면 Normal 모드로 시작하는데요. 이때 키를 누르면 글자가 입력되는 대신 이동·편집 명령이 실행됩니다. 글자를 쓰려면 먼저 i를 눌러 Insert 모드로 바꿔야 합니다.

  1. i를 누르고 one two를 입력합니다.
  2. Esc를 눌러 Normal 모드로 돌아옵니다.
  3. :w를 입력하고 Enter를 눌러 저장합니다.

i로 입력을 시작하고 Esc로 입력을 끝낸다고 생각하면 됩니다. 아래에서도 <Esc>는 Esc 키를, <Enter>는 Enter 키를 뜻합니다. 꺾쇠괄호까지 입력하는 것은 아닙니다.

저장하고 종료할 때는 :wq<Enter>를 씁니다. 저장하지 않은 수정이 없을 때 나가려면 :q<Enter>, 저장하지 않은 수정을 버리고 나가려면 :q!<Enter>입니다. 뒤의 예제도 이어서 따라 할 수 있도록 지금은 파일을 열어 두세요.

다음 단어로 이동하기

Esc를 누른 뒤 0을 누르면 커서가 행 맨 앞, one two의 첫 글자 o 위에 놓입니다. 여기서 w를 누르면 다음 단어인 two의 t로 이동하죠. 아래에서는 커서 위치를 대괄호로 표시했으니, 대괄호는 파일에 입력하지 않아도 됩니다.

Move with w

[o]ne two  →  one [t]wo

방향키로 여러 번 움직이는 대신 w 한 번으로 다음 단어에 도착했습니다. 현재 단어의 끝으로 가려면 e, 이전 단어의 시작 쪽으로 돌아가려면 b를 씁니다.

이동할 범위를 지우기

0으로 다시 첫 o에 커서를 놓고, d와 w를 차례로 누릅니다. 동시에 누르는 단축키가 아닙니다. dw는 현재 위치에서 다음 단어 시작 전까지 지우므로 one과 그 뒤 공백이 사라집니다.

Delete with dw

one two  →  two

w만 누르면 커서가 이동하지만, 앞에 삭제 명령인 d를 붙이면 그 범위가 지워집니다. 같은 이동 명령을 어디까지 지울지 정하는 데도 쓰는 셈입니다. 행 끝으로 이동하는 $도 마찬가지입니다. d$는 현재 커서부터 행 끝까지 지웁니다. 강의의 Vim’s interface is a programming language 절에서 이런 조합 방식을 설명합니다.

지운 자리에 다른 단어 넣기

u로 삭제를 되돌려 one two로 돌아온 뒤, 0으로 첫 o에 커서를 놓고 c, w를 차례로 눌러 보세요. 이번에는 one이 지워지면서 바로 Insert 모드로 바뀝니다. 그 자리에 new를 입력하고 Esc를 누르면 아래처럼 됩니다.

Change with cw

one two  →  new two

입력 순서를 붙여 쓰면 cwnew<Esc>인데요. 앞에서 쓴 dw는 뒤 공백까지 지웠지만, 단어 위에서 쓰는 cw는 단어 끝까지만 바꾸므로 공백이 남습니다. 삭제한 뒤 Normal 모드에 머무는 d와 달리, c는 지운 자리에 바로 새 내용을 입력할 수 있게 해 줍니다.

괄호 안을 고칠 때는 ci(를 쓸 수 있습니다. call(old)의 old 안에 커서를 놓고 ci(를 누르면 괄호는 남고 old만 지워집니다. 이어서 new를 입력하고 Esc를 누르면 call(new)가 됩니다. 여기서 c는 변경, i(는 괄호 안쪽이라는 범위입니다.

명령을 다시 찾아볼 때

본문의 예제처럼 이동·편집 명령은 Normal 모드에서 시작합니다. 표에서 {motion}은 그대로 입력하는 글자가 아니라 w, $ 같은 이동 명령을 넣는 자리입니다. {char}에는 찾을 문자 하나를 넣습니다.

모드

모드 들어가는 키 하는 일
Normal <Esc> 커서 이동과 편집 명령 실행
Insert i 글자 입력
Visual v / V (행 단위) 편집할 범위 선택
Command-line : 저장·종료·치환 명령 입력

이동

명령 이동할 위치 예시
h / j / k / l 왼쪽 / 아래 / 위 / 오른쪽 3j로 세 행 아래로 이동
w / b / e 다음 단어 시작 / 이전 단어 시작 / 단어 끝 one two의 첫 o에서 w → two의 t
0 / ^ / $ 행 맨 앞 / 공백을 제외한 첫 문자 / 행 맨 뒤 들여쓴 행에서 0 → 첫 공백, ^ → 첫 글자
gg / G 파일 처음 / 끝 G로 마지막 행으로 이동
Ctrl-u / Ctrl-d 반 페이지 위 / 아래 Ctrl-d로 반 페이지 내려가며 읽기
f{char} 현재 행에서 다음 {char} call(arg)의 c에서 f( → 여는 괄호
/pattern 패턴 검색. n으로 같은 방향, N으로 반대 방향 검색 /TODO → <Enter>로 검색, n으로 다음 결과

편집

명령 하는 일 예시
i / a 커서 앞 / 뒤에서 입력 시작 abc의 b에서 iX<Esc> → aXbc
o / O 현재 행 아래 / 위에 새 행을 만들고 입력 시작 ohello<Esc>로 아래 행에 hello 입력
x 문자 하나 삭제 abc의 b에서 x → ac
d{motion} 지정한 범위 삭제. dd는 현재 행 삭제 one two의 첫 o에서 dw → two
c{motion} 지정한 범위를 지우고 입력 모드로 전환 one two의 첫 o에서 cwnew<Esc> → new two
y{motion} 지정한 범위 복사. p로 붙여넣기 yy → p로 현재 행을 바로 아래에 복제
u / Ctrl-r 실행 취소 / 다시 실행 x로 지운 문자를 u로 복원, Ctrl-r로 다시 삭제

같은 내용을 한꺼번에 바꾸기

같은 단어가 여러 곳에 있다면 커서를 하나씩 옮길 필요 없이 치환 명령 :s을 쓰면 됩니다. 한 행에 old old를 적고 :s/old/new/를 실행해 보세요. 결과는 new old인데요. 기본 설정에서는 현재 행의 첫 번째 항목만 바뀌기 때문입니다.

Search and replace

:s/old/new/
:s/old/new/g
:%s/old/new/g

끝에 g를 붙이면 현재 행의 모든 old를 바꿉니다. 앞에 %까지 붙이면 파일 전체에 적용합니다. 즉 두 번째 명령은 같은 행을 new new로 바꾸고, 세 번째 명령은 다른 행에 있는 old도 바꿉니다.

설정과 연습

Vim을 처음 사용한다면 터미널에서 vimtutor를 실행해 기본 조작을 연습할 수 있습니다. 설정은 ~/.vimrc에 적습니다. 예를 들어 set incsearch를 넣으면 검색어를 입력하는 중에도 결과를 볼 수 있습니다. 강의를 보면서 적용한 설정은 vimrc에 주석과 함께 정리해 뒀습니다.