1 편집기論 #
의사가 메스로 환자를 수술하듯이 프로그래머는 편집기로 프로그램을 짠다. 의사 만화들을 보면 신기에 가까운 메스 손놀림에 박수를 보내듯이, 만약 프로그래머 만화가 있었다면 그들의 놀라운 편집기 다루는 솜씨가 찬탄의 대상이 될 것이다. (오바 3g.) 분명 편집기로 실제 코딩을 하는 것보다 근간이 되는 아이디어를 내는 것이 훨씬 중요한 것이다. 하지만 그것을 자유롭게 표현하고 고치고 수정하는 편집기 솜씨가 있다면 이보다 더 좋을 순 없는 것이다.
2 vim 입문서 #
Yui는 Vim 중급 유저이다. 뜬금없이 내가 생각하는 급의 단계를 적어보면 다음과 같다.
- 무급 : Vim이 모야?
- 저급 : 화살표키로 커서 이동하는 유저들. 무급보다 더 나쁘다. (?EditPlus나 ?UltraEdit를 쓰세요.)
- 초급 : 메모장이나 워드 프로그램에서 :wq를 입력한다.
- 중급 : Vim 명령어의 개념을 이해한다. (motion과 change 등.) :grep이나 :make, ctags와 cscope과 함께 Vim을 즐긴다.
- 상급 : 각종 스크립트와 macro, map 등으로 커스터마이즈된 Vim 환경을 만끽한다.
- 고급 : Vim의 help 메뉴를 모두 읽고 이해한다.
- 신급 : Vim의 help 메뉴, 내가 썼다.
난 아직 중급이지만, 이정도만 되어도 Windows에 Gvim이 안 깔려있으면 투덜댈 정도다. 그정도로 편하고, 아름답고, 기능적이고, 완벽한... 헉헉헉(-_-) 편집기다.
얼마전 회사 동료분에게 Vim을 설명하면서 한글로된 입문서(Tutorial, Not Manual)가 없다는 것이 아쉬웠다. 아쉬운 자가 만드는 이 바닥 생리에 따라 이렇게 시작하게 되었다. 가급적 설명을 간단하게, 그리고 실용적인 기능을 위주로 다뤄보겠다. 마지막으로 한마디 하자면 Vim에는 "지금 당신이 하는 것보다 더 짧은 명령어로 더 편하게 수정하는 방법이 언제나 존재한다." 라는 점을 절대 잊지 말라. 편집할 때 타이핑 한번이라도 줄이려고 노력하는 자만이 신급에 도달할 수 있으리...
삽질에도 도가 있다. 한번의 타격으로 적당한 각도와 적당한 깊이만큼 삽을 찌르고, 적절한 곳에 힘을 가하여 지렛대의 원리로 흙을 들어올리는 기술! 고수가 될 수록 정말 간단하게 힘 안들이고 삽질을 한다. 그말인즉슨 초보는 무지하게 괴롭다는 거다. Vim 도 마찬가지다. 처음엔 고생할 각오를 해야한다. 마음 단단히 먹고 출발~!
2.2.1 모든 길은 키보드로 통한다 #
시작하기 전에 다시 강조하겠다. 이쯤 말하면 얼마나 중요한지 알 것이다.
키보드 왼쪽 부분(영/한글자가 씌여있는 키보드의 왼쪽부분)만을 사용하라. 손이 한번 오른쪽으로 갈 수록, Vim에서 더 멀어지게 되며, 결국 참맛을 못느끼고 Vim을 떠나는 안타까운 일이 생긴다. 말이 나온 김에 보통의 편집기와 Vim이 큰 차이를 보이는 것을 살펴보자.
자, 궁금할 것이다. 화살표키를 쓰지 말라니. 그럼 어떻게 커서를 움직이란 말이야? 비밀은 모드(mode)에 있다. 마치 a를 그냥 누르면 소문자 a가 찍히고, shift를 누른 상태에서 a를 누르면 대문자 A가 찍히는 것과 비슷한 이치다. Vim에는 입력 모드와 명령 모드의 두가지(세가지지만 일단 두개만 알자) 모드가 있다. 입력모드에서 j를 누르면 j가 입력되지만, 명령모드에서 j를 누르면 커서가 아래로 간다. 오호라.
이제 익혀야할 것이 정해졌다. 모드를 전환하는 방법과 명령 모드에서 각각의 키가 어떤 작용을 하는지 배우는 것이다. 하나씩 해보자.
우선 실행을 해야한다. 입력모드는 하지 않을 것이므로 일단 적절한 텍스트가 있는 파일을 Vim으로 연다.
$ vim .bashrc (위험한 짓이다.)
이제 움직여보자. 가장 중요한 키는 키보드에 순서대로 놓인
hjkl이다.
^
< h j k l >
v
일단 hjkl로 마음껏 움직여보라. 재미는 없겠지만 hjkl의 벽을 넘지 못하면 Vim의 미래는 없다.
:q
를 입력하면 종료한다. 만약 잘 안된다면 esc키를 한번 누르고 입력해보자.
이제 입력하는 것도 해본다. 다음과 같이 임시 파일을 열고,
$ vim test.txt
아래를 똑같이 입력한다. (<esc>는 esc키를 한번 누르라는 표시다.)
iHello, Vim<esc>:w:q
그리고 내용을 확인해보면
$ cat test.txt
Hello, Vim
처음에 괜히 i를 왜 치는지, <esc>는 무엇이며 :w는 무슨 작업을 하는지 궁금할 것이다. 이제 본격적으로 나아간다.
2.3 Vim의 매력에 빠져봅시다 #
메모장에서 편집할 때와 비교해가며 하나씩 알아본다.
| 메모장 | vim | 비고 |
| 화살표키 | hjkl | 많은 프로그램에서 이 키바인딩을 이용한다. (Mutt, ?NetHack, etc.) |
| ctrl + 오른쪽 화살표 | w | 한단어 앞으로 |
| ctrl + 왼쪽 화살표 | b | 한단어 뒤로 |
| 맨앞(Home) | 0또는 ^ | ^은 글자가 있는 맨앞, 0은 정말 맨 앞으로 이동 |
| 맨뒤(End) | $ | |
| page down | C-f | forward로 외우자. |
| page up | C-b | backward로 외우자. |
- 명령 모드 -> 입력 모드 : i
- 입력 모드 -> 명령 모드 : esc (or C-[)
위의 간단한 예에서 i나 esc키를 왜 썼는지 이제 이해가 될 것이다. 모드 전환은 굉장히 자주하게 된다. esc가 너무 멀리 있어서 귀찮다면, C-[를 이용하던지
?HappyHackingKeyboard를 구매하라.
| 메모장 | vim |
| 새로 만들기 | :e 새로운파일이름 |
| 열기 | :e 열고싶은파일이름 |
| 저장 | :w |
| 다른 이름으로 저장 | :w 저장하고싶은파일이름 |
| 끝내기 | :q |
| 저장안하고 종료 | :q! |
action과 move등에 대해서 적어야 하는데 댁시 귀찮군.
- 목표 : 한 파일안에 printf("어쩌구")로 되어 있는 것을 fprintf(stderr, "어쩌구")로 바꾸고 싶다. (뒤에 인자가 더 있어도 상관없다.)
- 답 : gg/printf<enter>cf(fprintf(stderr, <esc>n.n.n.n.n.n.n. (계속)
- 목표 : make로 컴파일했을 때 에러가 난 곳으로 바로 이동하고 싶다.
- 답 : :make, :cw, :cp, :cn, :cclo 를 이용한다
- 목표 : grep으로 찾은 것들로 바로 이동하고 싶다.
- 답 : :grep, :cw, :cp, :cn, :cclo
- 가끔 C-s를 눌러 멈추는 경우가 있다. 당황하지 말고 C-q를 누른다.