E D R , A S I H C RSS

vi

Contents

1. 개요
2. 역사와 현황
3. 이용
4. 특징
5. 장점
6. 단점
7. 메뉴얼


vi
개발자 Bill Joy
최초 릴리즈 1976년
개발 언어 C
운영 체제 BSD
언어 영어
라이선스 BSD 라이선스
vi improved
개발자 Bram Moolenaar
최초 릴리즈 1991년
개발 언어 C
운영 체제 멀티 플랫폼
언어 다국어 지원 (영어 기본)
라이선스 채리티웨어
GNU GPL
웹 사이트 http://www.vim.org/

1. 개요

vim.jpg
[JPG image (432.46 KB)]

UNIX 계열 운영체제에서 주로 쓰이는 유서깊은 오픈 소스 텍스트 에디터. "Visual editor"라는 뜻이다. 원칙적으로 텍스트 모드에서 작동하도록 만들어졌기 때문에 어떠한 플랫폼 용 버전을 사용해도 기본적으로 모든 GUI가 텍스트 문자로 이루어져 있다. 내부 창 구분이나 구역 분할 등등.

Emacs와는 아주 심한 라이벌 관계다. 영어판 위키페디아에는 편집기 전쟁이라는 항목으로 등록되어 있을 정도.

글번역기로 vim을 번역하면....

2. 역사와 현황

옛날 옛적에는 텍스트를 편집할 때 라인 에디터(ed)라는 물건을 썼는데, 요즘에는 텍스트 에디터가 당연히 WYSIWYG이지만 라인 에디터는 "어디부터 어디까지 보여줘라"를 명령해야 보여주고 편집이 가능해지는 등 아주 골치아프고 쓰기 불편한 물건이었다. 결국, BSD 유닉스를 만들던 버클리 대학에서 빌 조이라는 전설적인 프로그래머가 할일없던 주말에 코딩해서 만들어 넣었다고 알려져있다.[1] 빌 조이는 후에 자바와 솔라리스등으로 유명한 썬의 공동창업자가 된다. vi가 등장하면서 텍스트 에디팅이 매우 편해졌고, 라인 에디터에 플러그인으로 들어가 있던 vi가 아주 인기가 좋자 아예 별도의 프로그램으로 만들어 버린 것.

우분투를 비롯한 많은수의 리눅스오픈소스 유닉스에서는 vim 을 vi 로 alias 시켜놓았기때문에 vi 를 쳐도 vim 으로 연결된다[2]. 때문에, 요즘 말하는 vi는 대부분 변종판인 vim(vi improved)을 지칭하며, nVi(Not Vi), elVis등의 다른 변종도 존재한다. 특히 vim은 모든 리눅스 배포판과 OS X에 기본으로 탑재되면서 거의 대부분의 vi 이용자가 이 버전으로 입문해서 이 버전을 사용하고 있을 정도. 게다가 vim을 GUI 환경에서 쓸 수 있게 GVim으로도 변종되었다. 당장 이 문서 상단 스크린샷도 GVim의 스크린샷이다.

3. 이용

일단 초보자들이 vi를 처음 보고 가장 당황하는 것은 실행을 시켰는데 키보드가 먹히질 않는다는 점이다. 당황해서 막 누르다보면 또 어느 순간 입력이 되기 시작한다. vi에는 일반 모드, 입력 모드, 명령 모드의 세 가지 모드가 존재하기 때문인데, 그걸 모르고 초심자가 vi로 뭔가 하려고 손댔다가 입력은 안 되지, 삭제도 안 되지, 갑자기 모드가 바뀌어서 입력이 되지, esc 눌러도 종료는 안 되지... 하는 상황 때문에 봉변을 당하는 경우가 많다. 이런 초심자들에게는 리눅스에서는 nano를, FreeBSD 에서는 ee 를 변태에게는 ed 나 cat 을 권하자. 혹은 리눅스 이용자라면 대부분 배포판에 vimtutor라는 튜토리얼이 깔려있으니 이를 사용해서 하라는대로 해보면 어느 정도 중요한 기능들을 익힐 수 있다.

생소한 이유는 vi의 뿌리가 GUI에 익숙한 사용자들로서는 접하기 힘든 라인 에디터 개념에 기반하고 있기 때문. 라인 에디터는 편집할 줄과 편집방식을 지정-> 방식에 따라 편집->다시 돌아와서 다음 번 편집할 줄과 편집방식을 지정 의 순환을 거치며 작동하는데[3], vi와 익히 알려진 편집기들의 사용상의 미묘한 차이점은 이 기본원칙을 안다면 납득이 갈 것이다. 요약하자면 진입장벽이 높고 복잡한 모드라는 직관성을 다소 희생하는 수단을 취하는 대신 텍스트를 조작하는 기능에 치중하여 다른 에디터에 비하여 매우 간단한 키 스트로크로 텍스트를 조작하는것이 가능하게 되었다고 보면 된다. 게다가 당시 컴퓨터 스크린에 지금의 모니터처럼 다양하고 직관적인 그래픽적 표시를 할 수가 없으므로 화면에 일일히 시각적으로 표시해 주지 않을 바에야 최대한 짧고 간결한 명령조작 체계를 도입하는 것이 합리적이었다.

vi의 해괴한(?) 기능키 선정 역시 당시의 키보드 구조를 보면 납득이 가는데, 아래의 그림을 보면 알 수 있겠지만 많이 쓰는 ESC, Ctrl 키는 지금과 달리 아주 가까운 곳에 있고 방향키는 애초에 키보드에 없어서 다른 키에 매핑하고 있는 것을 알 수 있다. 물론 지금 와서 완전한 구형 키배치를 쓰는 키보드는 해피해킹과 같은 덕후용(?) 특수 생산품을 제외하고는 거의 없긴 하지만, 사람 버릇이 된 단축키라는 것이 어디 그리 쉽게 옮겨가던가. HWP 최신버전 vs HWP97 행망용와 행정병의 애증의 관계(FPS에서 마우스와 키보드를 동시에 쓰기 위해 방향을 WASD로 옮겨서 쓰는 것이 관습인 처럼)

Emacs 와 비교하여 말하자면, 커맨드 입력을 위해서는 거의 항상 양손이 키보드 위에 있어야 하는 Emacs 에 비해 vi 에서의 편집은 한손만으로도 웬만한것들은 가능하다. 그리고, 한번 여기에 맛들이면 항시 양손을 사용해야 하거나 마우스를 건드려야 하는 에디터에는 기능이고 뭐고를 떠나서 자연스레 거부반응이 늘어나게 된다.

4. 특징

편집 자체를 따로 하나의 모드로 구성하여 키조작을 크게 단순화시킨것이 특징이다. 예를들어, 일반 에디터에서는 입력모드와 편집모드가 구분이 되어있지 않기때문에, 텍스트 입력에 쓰이는 알파벳이나 숫자키 자체를 기능키로 사용하지는 못한다. 덕분에 편집시에는 손가락이 거의 항상 shift, ctrl, alt 쪽에 붙어있어야 하는데, vi 에서는 그냥 단타나 연타로 끝난다. 예를들어, 커서움직임은 hjkl, 한글자 지우기는 그냥 x, 한줄 전체 지우기(컷)는 dd, 한줄 전체 복사는 yy, 붙여넣기는 p 식이라, 기본적인 수준의 편집은 그냥 hjkl 로 움직이고 지우고 복붙하고 하면서 커피마시면서 한손으로도 가능하다.

두번째는 함수형 명령들이다. 함수형 명령이란 예를들어 f(x,y) 가 있다면 f x y 를 순서대로 입력하는 방식이다. 쉽게 예를들면, d 라는 명령은 이것만으로는 아무것도 일어나지 않는다. 위의 예에서 f 와 같은 함수라, 인자를 받아야 작동한다. 물론, 아무인자나 받는것은 아니고 '커서이동'에 관한 명령을 인자로 받는다. 즉, 우측으로 한칸 이동하는 명령인 l 을 인자로 주어 dl 을 순서대로 입력하면 우측 한글자가 지워지고, 줄의 맨 처음으로 커서를 보내는 ^(혹은 0) 와 조합하여 d^ 를 순서대로 입력하면 해당 위치에서 줄 첫부분까지가 모두 지워지는식이다.

이것이 가장 많이 쓰이는 부분이 바로 수+명령인데, vi 에서 수는 뒤에 오는 인자를 받아 그 수만큼 반복실행하는 함수로 볼 수 있다. 즉, 문자 하나를 지우는 x 라는 명령과 수 50 을 조합하여 50x 를 입력하면 50글자가 지워지는식이다.

참고로, Currying 이 적용되기때문에 함수가 함수를 받는것도 역시 가능하다. 즉, 5dk 라는 명령은 5라는 함수, d 라는 함수 그리고 k 라는 커서이동 인자로 구성되어 5(d(k)) 라는 함수로 볼 수 있다. 즉, d(k) 라는 함수를 5번 반복하는 명령이 된다. k 가 커서를 한줄 위로 올리는것이고, dk 는 윗줄을 지우는 명령이 되기때문에 위로 5dk 는 위로 5줄을 삭제하는 명령정도로 볼 수 있다.

이런식으로 매우 간편하게 입력가능한 편집명령에 더해서 그것을 함수형으로 조합하여 타수를 더욱 절약하는것이 가능하기때문에, 그것에 특화된 기능이 따로 제공되지 않는 복잡한 작업일수록 vim 에서 타수는 훨씬 줄어든다.

5. 장점

숙달되면 아주 편하고 강력한 에디터가 되는데, 커서 이동을 비롯하여 대부분의 편집 명령어가 키보드 중심에 몰려있고, 모드를 이용하여 키조합을 하지 않아도 되는 경우가 많기 때문에 같은 작업을 해도 타 에디터에 비해 손동작이나 타수가 크게 줄어든다. 텍스트 편집에 한정해서는 어떤 물건과 비교해도 크게 꿇릴 일이 없다. 즉, 단축키 등을 모두 습득하면 아주 빠르고 능률적으로 작업을 할 수 있다. 특히 중요한 점은, 어떤 유닉스나 리눅스 시스템에 가도 vi는 기본적으로 깔려 있다는 것. 그 결과, vi 의 키조합은 유닉스의 상징과도 비슷한 존재가 되어 오늘날 웹브라우저, 파일매니저 및 기타등등 유닉스용 프로그램 상당수는 에디터가 아니라 할지라도 기본적인 vi 의 키맵을 지원하는 경우가 많다. 참고로, 중증 vi 중독 환자는 윈도에서도 편하다고 vi를 깔아서 쓴다(...)[4]

vi 가 어렵다는 인식이 있는데, 실제 어려운 건 Emacs 이고, vi 의 경우는 처음에 직관적이지 않을뿐, 매우 빠르게 습득이 가능하다. vi 가 다양한 빌트인 함수를 이용하는 것이라면, emacs 의 경우에는 아예 함수를 바닥부터 직접 만들어서 쓰는 에디터라 보면 간단하다. 덕분에 Emacs 는 단순 에디터의 영역을 넘어 뉴스리더, 웹서핑, 메일 클라이언트, 파일매니저 등등등을 다 수행이 가능하고 그만큼 제대로 사용하기가 엄청나게 어렵다.

명령어를 외울때도 자주 쓰는 명령어조차 키 조합을 추가로 조합해서 사용하는 경우가 잦은 Emacs 에 반해 vi 에서는 그냥 영문 단타로 끝나는 경우가 많아 금방 손에 익게 된다. 물론, 강력한 사용을 위해서는 정규표현식도 습득할 필요가 있지만, 이것은 굳이 vi 가 아니더라도 유닉스 환경이나 프로그래밍에서 모르면 안 되는 것에 속하고, 굳이 모르더라도 매크로 기능으로 대부분 대체가 가능하다.[5] 즉, 기본적인 커서이동, 모드전환, kill/yank/paste, 버퍼/창관리에 더해 정규표현식과 매크로만 어느정도 알아도 기본적인 사용에는 거의 문제가 없으며, 텍스트 편집 시 훨씬 적어지는 키보드 타수를 느낄 수 있다.

vi-keyboard.png
[PNG image (27.15 KB)]


참고로, 이것이 처음 나온 1976년 당시에는 사진과 같이 키보드에 화살표 키가 따로 배정되지 않았다. 일반 모드에서의 hjkl키는 이 화살표 키를 대신하는 키들. 요즘은 화살표 키를 사용해도 된다. 그리고, 당시 키보드는 사진에서 보이듯이 ESC 와 ctrl 이 누르기 아주 편한 위치에 있기 때문에 vi 의 키배열도 이에 최적화되어 ESC 와 ctrl 을 많이 사용한다. 하지만, 오늘날 키보드에서는 이 두 키 모두 키보드 중심과는 좀 떨어져 있기 때문에 OS 상에서 키 배열을 바꿔쓰는 게 편하다. 아니면, 해피 해킹 키보드 같은 경우는 아예 윈도우 사용자를 전혀 고려하지 않고 vi 에 최적화되어 나온 키보드라 볼 수 있으니 골수 vi 팬이라면 가격이 비싸지만 장만하는 것도 나쁘지 않을 것이다.

curves.jpg
[JPG image (25.87 KB)]

VIM은 그냥 처음부터 끝까지 어렵습니다 ?[6]
갈수록 안드로메다로 향하는 emacs
vi ~/.emacs
비주얼 스튜디오는 쓰다보면 다시 초보가 된다?

6. 단점

초심자가 익숙해지기까지의 과정이 험난하다. 까놓고 말하면 불편하다. 숙달되면 편하고 강력하다지만 일단 숙달이 필요하다는 것 자체가 불편하다는 가장 큰 증거다. 게다가 이미 vi에 익숙한 사람들은 이런 장벽을 과소평가하는 경향이 있다. 넉넉잡아 하루 '정도'면 기본적인 조작은 습득 가능하다고 하지만, 일반인들은 기본조작 배우는데 하루 '씩이나' 필요하단 사실에 놀라는 건 무시하자 그건 바둑 기본 규칙 대여섯가지 알려줘놓고 이제 바둑을 '둘 수 있다'고 말하는 것과 다르지 않다. vi의 강력함은 수많은 명령어와 이들의 조합/연계에서 오는데, 이것을 하루이틀만에 배우고 써먹는 것은 불가능하다. 그리고 그 단계에 이르기 전까진 vi는 속도/기능에서 메모장보다도 메리트가 없다.

화살표 대신 hjkl을 쓰고 Del 대신 x같은 명령어를 쓰는 것도 익숙해지면 타이핑 기본 자세에서 커서를 움직일 수 있고 키보드 구석까지 손을 안가져가도 되는 획기적인 배열이겠지만, 배우는 입장에선 WASD 같이 직관적인 방향이 있는 것도 아닌 걍 평면에 화살표 그려놓은 것일 뿐이다. 무엇보다 인간은 새것을 배우는데 인색하다. 보통 사람들은 십중팔구는 "우왕, 열심히 hjkl키를 익혀서 더 편하게 써야지!"라는 반응이 아니라 "요즘 버전은 화살표도 지원하잖아? 걍 화살표 쓸게." 같은 반응을 보인다(...)

두번째로, 현재 키보드 배치에서는 vi에서 가장 중요한 키인 ESC가 왼쪽 위 구석에 박혀있기 때문에 vi의 장점인 손이 많이 안움직여도 된다는 사실도 반감되었다.[7] ESC 페달을 사용하면 편하다 보통은 Caps Lock 과 Ctrl 위치를 바꿔쓰는 경우가 많은데, vi 의 경우는 위와같은 이유 때문에 추가적으로 Tab 과 ESC 위치를 바꾸는것도 권장된다. 또, vi에 익숙하다고 해도 유닉스 터미널에서 프로그래밍 하는게 아닌한 다른일 하기 위해 마우스에는 손이 가야한다는 점도 있다.

숙련된 프로그래머가 사용할 경우 일반적인 에디터보다 빠르게 소스 코드를 편집할 수 있긴 하나, 그렇다고 생산성을 극적으로 올려준다고 보기는 힘들다. 예를 들어 윈도우즈 프로그램을 vi 와 WinAPI를 써서 개발하는 것보다 그냥 일반적인 IDE에 MFC로 개발하는 것이 더 빠를 것이며, 비주얼 스튜디오, 이클립스 등 강력한 IDE에서 언어에 특화된 여러 기능들을 제공하기 때문에 그런 기능을 이용하지 않는다면 구질구질하게 타이핑 할 것을 클릭 몇번만에 코딩, 리팩터링 작업을 할 수도 있을 정도. vi가 텍스트 편집에 이점이 있더라도 좋은 프레임워크와 클릭 몇번으로 많은 타이핑 작업을 대체할 수 있는 IDE를 사용하는 것보다 생산성이 높다고 할 수는 없다. 프로그래밍을 할때 타이핑에 걸리는 시간은 극히 적다 나가토 유키 같은 경우가 아니라면
물론 vi 와 육중한 IDE 의 기능은 서로 충돌하는 것이 아니다. vi 의 핵심은 키맵이고, IDE 의 핵심은 특정 언어에 특화된 여러가지 편의기능들이다. 즉, 다양한 편의기능을 갖고있는 IDE 에 vi 의 키맵을 올려 사용한다거나 혹은 vi 에서 편집하고 IDE 로 불러와서 원하는 기능을 적용하는식으로 얼마든지 절충이 가능하다. 단순한 비호가 아니고, vi 와 IDE 를 동시에 사용하는 프로그래머도 적지 않으며, 실제로 많이 쓰는 IDE&에디터에는 vi 플러그인이 있는 경우가 많다. 예로, 비주얼 스튜디오 #이클립스 # 같은 IDE 들에서 익스텐션 형태로 vi의 키맵을 이용할 수 있다.

반대로, 전세계 vim덕후(..)들이 만들어 놓은 vim 플러그인을 붙이고 설정 파일 커스터마이징하면 텍스트 에디터 수준을 넘은 강력한 자동 완성 기능을 포함한 일종의 IDE(..)로 만들어 놓을 수 있다.

한글을 사용하는 사용자라면 입력모드에서 ESC를 눌러 일반모드로 전환 시 한글 입력 모드를 영어 입력 모드로 변환해야 하는 번거로움이 있다. ESC 누르고, 한/영 변환키 누르고 vim 자체에서 해결하는 방법도 있지만, pc 환경에 따라 해결이 안 되는 경우도 많다. 이 경우 입력기를 ibus 대신 UIM 및 UIM 벼루를 사용하면 된다. UIM에는 vim 사용자들을 위해 ESC를 누를 시 자동으로 영어 입력 모드로 변환해 주는 기능이 있다. vim을 주로 사용하는 사용자라면 UIM을 사용하는 것이 정신건강에 이롭다.

또 한가지 문제라면 정규표현식이나 GVIM 자체 렌더링 속도가 빠르지 않다. 요즘 컴퓨터에서 아주 문제될 정도는 아니지만 심한 경우에는 버벅거리는 경우가 있는데 주로 IDE처럼 변수명 하이라이팅을 하면 이런 일이 생긴다. 해결 방법은 하이라이팅을 끄던지 참고 쓰던지 다른 에디터로 갈아 타던지.

7. 메뉴얼

다음은 vi에서 주로 사용하는 3가지 모드.

Vi_How_it_Works_angelhalo.png
[PNG image (76.98 KB)]


  • 입력 모드 : 일반 모드에서 i(현 커서위치에서 입력모드), a(현 커서 한칸 뒤에서 입력모드), o(한줄추가후 입력모드)등을 입력했을 때 자동으로 들어가는 모드로, 이 상태에서만 텍스트 입력이 가능하다.
  • 일반 모드 : 화살표 이동이나 특정 문자 수정/삭제 및 편집에 쓰이는 대부분의 명령어가 여기서 실행된다. 이 모드가 기본 모드이다.
  • 명령 모드 : 시스템과 관련된 부분을 담당하는 모드. 일반 모드에서 :(콜론)을 누르면 된다. 다음 명령을 사용할 수 있으며, 뒤에 느낌표를 붙이면 강제 명령으로 실행된다. 입력한 명령어는 하단 버퍼에서 볼 수 있다. 기본적인것만 알아보면,
    • w : 파일을 저장한다.
    • q : vi를 종료한다. 파일을 변경하고 저장하지 않은채 이 명령어를 사용하거나 하면 종료가 되지 않고, 이때 강제종료를 원하면 ! 를 붙여 q! 를 입력하면 된다.
    • wq : 파일을 저장하고 vi를 종료한다. 마찬가지로 강제적용은 ! 를 붙여 wq! 로 쓴다.

vim에서는 wq 대용으로 x 명령어가 있다. 기능은 같다.(:x 의 경우 변동 사항이 없으면 그냥 종료 한다. 반면 :wq는 항상 저장하고 종료한다)

스크립트를 통한 확장 기능을 사용할 수 있다. vim 사이트에서 하나씩 받아서 적용할 수도 있으나, vundle이란 확장 기능을 통해 플러그인 설치 자동화를 할 수 있다. http://wiki.kldp.org/wiki.php/VimEditor 에서 vundle 관련 내용을 참조.

더 자세한 매뉴얼은 여기 : http://vimhelp.appspot.com/

윈도우용 최신버전은 여기 : http://www.vim.org/download.php#pc

vim 플러그인들을 정리해 놓은 곳 : http://vimawesome.com/

보기 드물게 vim을 활용하여 웹개발을 학습하는 곳, vim 튜토리얼도 제공한다 : http://codelion.net/

----
  • [1] 나중에 인터뷰에서 진짜 주말에 잠깐 해서 만든건 아니라고 이야기했다.
  • [2] 상업용으로 팔리는 유닉스는 아닌 경우도 있다.
  • [3] 이건 과거 에디터들의 주된 사용 용도가 C 프로그래밍이기 때문이다. 프로그래밍의 특징상 한번에 타이핑하기보단 조금씩 변경, 추가를 하는 일이 많다.
  • [4] 윈도 판이 따로 있다. 실행하면 유닉스나 리눅스에서와 똑같이 윈도우 창에 텍스트 화면만 달랑 나온다(...).
  • [5] 말그대로 키 스트로크를 레코딩해서 원하는 횟수만큼 자동 반복을 시키는 기능이다. 정규표현식의 경우 더 편리하긴 하지만, 사소한 오타에 왕창 잘못되는 경우가 많아(undo 기능이 있으니 큰 문제는 아니다.), 직접 눈으로 중간과정을 보면서 컨트롤이 가능한 매크로 기능을 더 애용하는 사람도 많다.
  • [6] Y축이 난이도가 아닌 숙련도이며, 기울기가 바로 난이도를 의미하기 때문에 vim을 배우기 위해서는 극초반에 개고생을 해야 한다는 게 정확한 해석이다
  • [7] vi 가 타겟으로 했던 키보드에서는 현재의 Tab 위치에 ESC 가 위치해있었다.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2015-02-28 14:38:06
Processing time 0.1602 sec