본문 바로가기

카테고리 없음

고수를 위한 고전 에디터 vim

2004년 봄 SI회사에 처음 취직을 했다. 이제 그동안 연마했던 내 플그램 실력을 발휘할 수 있다니 기대도 있으면서 두렵기도 했다. 아직 파견은 못 나가고 본사에서 잡일을 하며 대기를 했다. 당시 나에게 SI 사이트는 하나의 무림 강호였고 SI 사이트에서 일하는 개발자들은 무림의 고수들이었으며, 무림의 고수들이 쓰는 노트북은 고수들만이 쓰는 멋진 무기였다. 지금에 와서는 어이없지만 나는 SI에 대한 동경을 가진 순진한 IT개발자 지망생이었다.

어느날 우리 회사 무림의 고수 선배가 그 험난한 SI를 마치고 잠시 본사로 귀환했다. 나에게 그 선배는 존경과 동경의 대상이었다. 특히 그 선배가 쓰던 은빛 노트북은 왜 그리 빛나보였을까. 내가 쓰던 중고 데스크탑이 일반 병사의 구식 창이라면 그 선배의 은빛 노트북은 삼국지 관우의 청룡언월도~ 처럼 빛나 보였다.

어느날 선배에게 내가 유지보수중인 복잡한 쿼리 하나에 대한 질문을 했다. 선배는 어느 새까만 창과 함께 그 쿼리를 불러들였다. 까만 화면에 빨간 커서가 인상적이었다. 해커들이 나오는 영화에서 종종 보던 그..화면이었다.

사용자 삽입 이미지
[뭔가 해커스러운 향기가 묻어나는 vim 편집화면]

그리고 이어진 놀라운 장면.. 선배가 마우스는 저기 멀리 던져놓고 키보드만 두드리는데 빨간 커서가 동에 번쩍 서에 번쩍 위로 갔다 아래로 갔다 정신없이 움직이더니 문자열이 사라졌다가 다른 곳에 나타나기도 하고 정렬안된 문자열이 키보드의 다다닥~ 소리와 함께 완벽하게 정렬되는.. 정신없으면서 신기한 장면이 연출되는 것이다. 그랬더니 지저분하고 정렬안된 쿼리 문자열이 깔끔하게 이발을 마친 사람의 머리처럼 산뜻하게 정리되어 있었다.

나는 넋놓고 바라보면서 경이로움과 함께 큰 충격을 받았다. “선배님..이게..뭐에요~?” “이거 vi란다…” “아 맞다..근데 vi는 리눅스용 아닌가요?” “윈도우에도 gvim을 설치하면 쓸수 있지..나는 오직 이 vim만 쓰고 있단다~”

나는 결심했다. 그래 이거야..나도 vim을 쓰는거야..내가 vim을 쓰는 것은 내가 프로그래밍에 열광하는 이유와 비슷했다. 뭔가 해커스럽고..뭔가 고수적인 분위기를 풍기는 그런 느낌..vim은 그런 멋진 느낌을 가져다 줄 수 있는 멋진 놈이었다. 당시 어린 IT개발자 지망생 나는 vim에 완전히 꽂혔다.

특히 선배의 다음 한마디가 인상적이었다. “SI 사이트에 나갈 때 주의할 것은 절대 겸손한 척, 모르는 모습을 보이면 안된다는 것이지, SI 사이트는 약육강식의 강호와도 같아서 몰라도 무조건 아는 것처럼 보이게 하는 것이 중요해~ 이런점에서 vim은 중요한 역할을 한단다. vim을 쓰면 못해도 잘하는 것처럼 보이는 효과를 가져다주지..너라면 EditPlus 쓰는 개발자와 vim쓰는 개발자 중 누가 더 잘하는 것 처럼 보이겠냐~”

그렇다. vim 을 써야 되는 이유는 충분했다. 열심히 vim을 연습하기 시작했다. 그러나 vim은 어려웠다. 기존의 에디터 다루는 방식하고는 너무도 틀려서 익숙하기 까지 많은 시간이 걸렸다. 마치 직립보행하던 인간이 물구나무 서서 걷는 법을 연습하는 것과 비슷했다. vim 조작하는 법에 익숙하기 까지 많은 시간이 걸렸다.

지금에 와서는 그리 고수처럼 보일 필요성도 못 느끼고, SI라면 고개를 절래절래 흔들며 싫어하는 이래도 흥~ 저래도 흥~ 하는 심드렁한 중급 개발자가 되었지만 여전히 vim은 멋진 해커가 되고 싶은 나의 꿈이 담긴 멋진 도구로 계속 쓰이고 있다.

요즘의 나는 이클립스를 메인 에디터 툴로 다루면서 vim을 복잡한 텍스트 편집용으로 쓰고 있다. 이번 글에서는 내가 주로 사용하는 vim의 메크로 기능을 이용한 한방 편집~ 과 IBM developerWorks의 vi 관련 유익한 기사를 소개한다.


나는 생활의 달인이란 프로를 좋아한다. 한분야에 일가를 이룬 달인들이 펼치는 놀라운 기술의 향연에 열광한다. 문득 개발자가 생활의 달인에 나가면 어떤 종목으로 나갈까~란 엉뚱한 생각을 한적이 있다. 사실 개발자로 달인은 뛰어난 두뇌의 소유자로 복잡다단한 분야의 설계를 잘하는 사람이거나 복잡다단한 알고리즘을 한방에 깔끔하게 구현하는 사람일 것이다. 그런데 생활의 달인처럼 좀더 기능적인 점을 강조한다면 소스 편집을 빨리 하는 개발자를 달인이라고 억지로 끼워맞출수 있을 것이다.

생활의 달인을 보면 일반인과 생활의 달인이 얼마나 빨리 하나 대결하는 모습이 나온다.

자 그럼 우리 개발자들도 미션을 내보자~! 우리의 미션은..

private String id;
private String password;
private String loginType;
private String telephone;
private String handphone;
private String addr1;
private String addr2;
private String email;
private String fax;
private String company;

의 변수 텍스트를 로그 찍어보게,

System.out.println("id ["+id+"]");
System.out.println("password ["+password+"]");
System.out.println("loginType ["+loginType+"]");
System.out.println("telephone ["+telephone+"]");
System.out.println("handphone ["+handphone+"]");
System.out.println("addr1 ["+addr1+"]");
System.out.println("addr2 ["+addr2+"]");
System.out.println("email ["+email+"]");
System.out.println("fax ["+fax+"]");
System.out.println("company ["+company+"]");

로 바꿔야 한다. 누가 얼마나 더 빨리 바꿀 수 있을 것인가. 한명은 일반 에디터로, 한명은 vim으로 시간 체크 해보겠다..자..준비..시작~!

[일반 에디터는 복사/붙여넣기 끝에 1분 20초에 끝남]

[vim은 vim의 메크로를 이용하여 순식간에 30초 이전에 끝냄]

결과 vim의 일방적인 승리다. 그럼 어떻게 vim이 빨리 편집을 끝낼수 있었을까. 그것은 vim의 메크로 기능을 이용했기 때문이다. 그럼 과정을 분석해보자.

1. private String id;
를 System.out.println("id ["+id+"]");
로 바꾸기 전에 일단 qa키를 눌러서 메크로를 걸어놓는다.
qa: a키에 메크로 레코딩

2. private String을 2dw로지운다.
2dw : 2개의 w(문자를) d(지운다.)
결과 : id;

3. i키를 눌러서 편집상태로 전환 후 System.out.prinln(“ 까지 입력한다.
결과 : System.out.println(“id;
                                   ^ (커서 위치)

4. 현재 커서 위치에서 오른쪽으로 한칸 더가고 yw를 입력하여 id문자열을 복사한다.
결과 : id 문자열이 복사됨

5. f; 로 커서를 ; 위치로 옮겨놓는다.
f; : 첫번째 ;문자위치까지 이동한다.
결과 : System.out.println(“id;
                                      ^ (커서 위치)

6. i버튼을 입력하여 삽입 상태로 변경하고 스페이스 [“+ 까지 입력한다.
결과 : System.out.println(“id [“+;
                                           ^(커서위치)

7 ESC 또는 Ctrl+[ 키를 눌러서 명령어 모드로 전환한다. 그리고 p키를 누른다. p키를 누르면 아까 복사하였던 id키가 붙여넣기 된다.
결과: System.out.println("id ["+id
                                            ^ (커서위치)

8. i키를 눌러서 삽입상태로 놓고 +”]”) 까지 입력한다.
결과: System.out.println("id ["+id+”]”);
                                                   ^ (커서 위치)

9. 자 여기까지 했으면 변환 완료, 다시 ESC 또는 Ctrl+[키를 눌러서 명령어모드로 전환하여 j키를 눌러서 커서 밑으로 한칸 그리고 0키를 눌러서 가장 처음 행으로 옮기자.

10. 여기까지 하면 메크로가 완성되었다. q키를 눌러서 메크로 저장 완료로 만든다.

11. 다음 9@a를 눌러서 a에 저장한 메크로를 9번 호출하자. 그러면 9번 메크로가 작동되면서 저절로
private String var; 가 저절로 System.out.println("var ["+var+"]"); 로 9번 변경될 것이다.

위의 메크로 기능이 내가 vim에서 가장많이 쓰는 기능이다. 방금 처럼 변수를 로그 찍는 방식은 자주 발생하는 일이다. 이때 vim의 메크로 기능을 쓸 수 있다면 그냥 한방 메크로로~ 편하게 작업 할 수 있다.

특히 vim에서 메크로 기능이 잘 쓰일 수 있는 것은 vim의 다양한 이동 및 편집 기능때문이다. vim에서는 2w등으로 두개의 문자를 이동하라든지, f;로 ;문자 바로 전까지 커서를 이동하라든지의 수많은 경우의 이동 상황이라도 정확하게 명령할수 있다. 편집 또한 yw로 하나의 문자열만 복사하라 든가 2dw로 두개의 문자를 지워라 든지 9p로 9번 붙여넣기 하라든가의 정확한 편집 명령도 수행할 수 있다. vim의 다양한 명령어를 조합하여 메크로를 설정하면 반복되는 다양한 편집 상황에서도 정확하고 빠르게 원하는 작업을 수행할 수있다.

나는 vim 을 자주 쓰는 개발자로 특히 vim의 메크로 편집 기능을 추천한다. 혹시 vim 초보자라면 IBM developerWorks의 vi 입문 -- 컨닝 페이퍼 이용하기를 추천한다.

vi를 하나하나 공부하면서 한방에 참고할 수 있는 하나의 컨닝페이퍼를 만드는 과정을 차곡차곡 설명하고 있다. vi의 초보자라면 북마크하여 두고두고 볼만한 기사다.

옛날 옛적에 만들어졌지만 그 누구도 그 편집 속도를 따라잡기 힘든 불멸의 고전 에디터 vim~! vim에는 다른 에디터에서 찾아 볼 수 없는 특유의 깊은 사상이 들어가 있다. 심플하면서 다양한 명령어, 그리고 이 명령어들의 조합으로 무한히 확장되는 강력한 편집기능은 마치 오랜시간 흘러도 두고두고 즐기는 테트리스처럼 세월이 흘러도 두고두고 쓰이는 실전 에디터로 우리 프로그래머/해커들 곁에 영원히 남을 것이다.

오랜 세월이 지나도 불멸의 에디터로 남아있는 vim 당신은 욕심쟁이 우후훗~ vim이여 영원하라~ (무릎팍 버전)
                                                                                  
> IBM developerWorks

developerWorks의 vi 입문 -- 컨닝 페이퍼 이용하기