본문 바로가기

무언가 만들기 위한 지식/Etc

VI(VIM) 명령어 & 사용법

VI란 Visual Editor의 앞의 두자를 딴 에디터 중의 하나이다.

이 에디터는 개발당시 Line 단위가 아닌 화면단위로 편집을 하는 획기적인 에디터였다.
1976년 Bill Joy(1954)가 캘리포니아 주립대 버클리 캠퍼스에서 ADM3A 터미널로 만들었다고 한다.- 왼쪽사진
(참고로 Bill Joy는 Sun Microsystems의 공동 설립자중에 하나이다. 자바의 실질적 아버지라고도 불리운다.)
윈도우용도 있기는 하지만 주로 유닉스에서 가장 많이 쓰이고 있고, 이와 비슷한 에디터로는 EMACS라는 에디터가 있다.

필자의 경우 Network Programming, System Programming, Datastructure등등 유닉스계열 쪽을 요즘들어 하다보니 vi를 자주 사용하게 되었고, 어쩔수 필요에 의해 적응되게 되었다.^^;
하지만 대부분의 서민(?)들이 윈도우 개발환경에 익숙해져 있어서 vi나 emacs사용에 차질이 있는 것은 사실이다.

유닉스가 윈도우랑 개념상은 거의 비슷하나 비쥬얼 차이가 있어서 사용이 쉽게 적응 되지 않는 것이지, 적응되면 윈도보다 더 효율적으로 할 수 있다.(라고 말했지만 필자도 사실 윈도우가 훨씬 편하다. Edit Plus나 Visula studio 등등등~)

이렇게 VI에 대해 포스팅을 하게 된 것도 뭐 VI사용하라는 것을 권하기 보다는,
어쩔수 없이 사용해야하는 윈도우에 익숙했던 사람들을 위해 기본적인 기능을 전달하고자 한다.

VI를 사용하다보면, 또는 기능 키들을 공부하다보면, 단축키들이 여간 이상하다는 생각을 하지 않을 수 없다.
가끔 단어 뜻에 맞아들어가는 것도 몇개 있지만, 영 엉뚱한 것들이 있다.
그 이유에 대해서는 필자도 후에 인터넷상에서 알게 되었는데, 나름의 사정이 있었다.
개발자인 빌 조이가 개발할 당시 사용한 입력장치가 Lear-siegler ADM3A 터미널 라는 것이 었는데 그 키들의 위치는 다음과 같다.


자판은 같지만 방향키가 숫자랑 겹쳐 있다는 점 CtrlEsc의 위치가 다르다.
이에 기인하여 당시 개발상황에서 나름 최대한 효율적인 키들을 선정했던 것이다.
한가지 큰 예로 들면 Esc가 왼쪽 가운데쯤 있는데 이는 현재의 tab의 위치에 있다. 그만큼 모드를 전환시키기에 좋은 위치에 있었던 것이다.(Vi에서 모드 전환은 esc키임-새끼손가락으로 누리기 쉬운 위치)
움직이는 방향키도 h,j,k,l그대로 존재한다.

이런 약간의 불편함으로 emacs사용자들은 Vi를 vicious interface라고 부를정도라고 한다. 그래도 vi는 아직까지 널리 쓰이고 있다. 특히 더 발전되고 개량되어 여러 버젼으로 공급, 각 시스템에 적용되고 있다.

Vi version : 각 사이트로 가서 관련정보도 확인가능 (http://thomer.com/vi/vi.html#versions)

  Unix and/or source MS-DOS Windows 3.x Windows 9x/2k/NT/XP OS/2
VIM1 vim-6.3.tar.bz2 vim63d16.zip Use MS-DOS gvim63.zip vim63os2.zip
Elvis2 elvis-2.2_0.tar.gz elvis-2.2_0-msdos.tar.gz Not available elvis-2.2_0-win32.tar.gz elvis-2.2_0-os2.tar.gz
VILE vile-tar.gz vile-dos.zip Not available vile-w32.zip vile-os2.zip
Lemmy Not available Not available Not available lemmy45.exe Not available
Nvi nvi-1.79.tar.gz Not available Not available Not available Not available
Stevie Not available stevie69s.zip3 Not available Not available stvi369g.zip
WinVi wsrc297.zip Not available winvi16.zip winvi32.zip Not available
xvi xvi2.47.tgz xviexe.zip Not available xvi.zip Not available
Pvic Not available pvic_dos.zip Not available Not available Not available
Calvin Not available calvin23.zip Not available Not available Not available
Bvi bvi-1.3.2.src.tar.gz Not available Not available Not available Not available
ex-vi ex-040605.tar.gz Not available Not available Not available Not available
levee levee-current.tar.gz Not available Not available Not available Not available
BusyBox's vi busybox-1.00.tar.gz Not available Not available Not available Not available

필자가 사용하는 버전은 VIM 7.0.235이다.
(vim은 vi의 클론이며, 한글을 완벽하게 지원하고 몇 가지 기능들이 추가되었다.)
[대부분의 유닉스계열 운영체제에는 포함되어 있다.]


어떤 분들의 글을 읽어보면 무식하게 외우지 말라고 한다. 결국 여러번 자신이 직접 작성해보고, 프로그래밍을 짜면서 손에 익숙해지는 것이다. 마치 군대에서 행정병이 한글97의 신이 되어서 제대하듯이, 자신이 여러번 사용하게 된다면 손에 익어서 더욱 빠른 편집이 가능해질 것이다. (한글97에서도 윈도우 기반이었지만 모든것을 단축키로 해결하지 않았는가.. Vi도 비슷한 원리로 더 빨리 쓰기위해 단축기를 사용한다고 생각하자.)
결국 파헤법은 자신이 vi를 많이 사용해보고 모를때마다 명령어를 찾아보는 것이다. 그러다보면 손에 익숙해져 더욱 빨라질 것이다.

몇몇 사람들의 이야기를 들어보면 vi는 기능이 별로 없어. 윈도우에서 작성하고 ftp로 파일 올리면 되지뭐 라고 하는데......
기능들이 직관적으로 눈에 보이지 않는 것이지 지원되는 기능은 다 있다.
복사에 이동에........ 기타등등등!!!!!!

다음에는 Vi명령어들이 정리되어 있는 곳이니 더 자세히 알고 싶다면 참고하기 바란다.

그럼 이제 필자가 사용하면서 가장 많이 쓰게되는 기능을 위주로 설명을 하겠다.

먼저 vi의 기본적인 방식을 이해하여야 한다.
vi는 (입력상태/명령상태/ex상태)총 3가지의 state를 가지고 있다. 이 3가지의 상태를 모르기 때문에 처음 사용하는 사람들은 원하는데로 입력이 되지 않기 때문에 당황해 하고 거부감마저 든다.
그럼 우리는 vi를 사용하기로 한 자들이므로(^^) 이 3가지 상태에 대해 알아보도록 하자.

명령상태란 처음 vi를 실행하였을 때의 모드로 간단한 커서이동, 검색, 명령어 수행 가능한 상태이다. 입력과 ex상태 사이에 존재하는 상태라고 생각하면 된다. 입력모드에서 ex모드로 가기 위해서는 반드시 명령상태를 거치게 되면 ex모드에서 입력상태로 가기 위해서도 명령상태를 반드시 거쳐야 한다.

입력상태란 우리에게 가장 익숙한 타이핑을 하는 상태이다. 자판상의 기호들이 입력된다. 이 상태에서 명령상태로 전환하기 위해서는 Esc를 누르면 명령상태로 가게된다. (명령상태에서 입력상태로 가기 위해서는 a,i,o를 누르면 된다.)

Ex모드에서는 각종 치환 파일 저장, 설정등의 작업을 수행한다. ex모드로 가기 위해서는 명령 상태에서 ":"을 누르고 명령어를 수행하면 된다. 다시 명령상태로 가기 위해서는 esc를 누르면 돌아온다.

이 3가지 상태가 상당히 비쥬얼 적으로 보여지는 것은 아니다. ex모드의 경우 [:]가 보이니까 그럭저럭 알아보지만 입력과 명령을 구분할수 없다. 그러나 사용하다보면 그런걱정을 할 필요는 전혀 없다. 이 3가지 모드라는 것 조차 개념적인 모드이고 타이핑이 되는 순간은 입력상태라고 생각하고 입력이 안되고 명령어가 먹힌다면 명령상태라고 생각하고, 자신이 필요에 의해 [:]를 누르게 된다면 그때가 Ex모드라고 생각하면 된다.
[visual적으로 하단부에 입력모드의 경우 (끼워넣기, 와 좌표)가 나온다. 명령모드는 아무것도 없고 ex모드는 ":"가 존재한다.]


입력상태 ↔ 명령상태  ↔  Ex모드


라는 사실만 알고 들어간다면 이해가 쉬울 것이다.
 
자 그럼 vi를 실행해 보자.
처름 실행법은
@> vi test.c
이다. vi 다음에 open할 파일명이나 새로 만들 파일명을 치면 된다. 같은 파일명이 현재 폴더에 없다면 새로 생성한다.
그리고 나서 이것저것 자신에게 필요한 문서들을 작성하였다고 가정하에 진행하겠다.

처음의 vi를 실행했을때의 상태는 명령상태이다. 이상태에서는 이미정해진 몇개의 명령어나 커서이동만이 가능하다.
우리는 몇개의 코드를 입력할 것이기 때문에 입력상태로 전환하기 위해 a 또는 i 또는 o를 입력한다.

입력을 위해 주로 사용되는 것은 a와 i이다.
a : 현재 커서의 오른쪽에 문자를 삽입
A : 커서 오른쪽, 행의 끝에 문자를 삽입
i : 현재 커서 왼쪽에 문자를 삽입
I : 커서 왼쪽, 행의 처음에 문자를 삽입
o : 커서 아래에 행을 삽입
O : 커서 위에 행을 삽입

커서를 움직이면서 a를 눌러 보통 다음 줄부터 삽입하거나, 문서의 맨 앞의 경우 i를 이용하여 왼쪽으로 문자를 삽입한다.

문자 작성의 엔터 및 tab키등은 모두 작용하고 명령어모드로 이동하기 위해서는 esc를 누른다.

삭제를 하기 위해서는 두가지가 존재한다.
하나는 입력모드에서 Backspace를 이용하여 지우는 법이다. 이경우는 우리에게 익숙하여 많이 쓰인다.
두번째는 입력모드에서 x와 d를 이용한다.
x : 해당 커서의 문자를 지운다. 한문자 씩 지워진다.
dw : 해당 커서로부터 오른쪽으로의 한 단어를 지운다. 한단어를 지우고 싶으면 단어의 처음에서 사용
dd : 해당 커서의 한 줄을 지운다.
d[숫자] + 방향키 : 숫자만큼의 줄 또는 문자를 지운다.
                          ex) d3 ↓ 해당 커서와 그 아래 3줄을 지운다.
                                d3 → 해당 커서부터 오른쪽으로 3칸을 지운다.
오타로 인하여 하나씩지울때는 x로 하나식 지워나고 한줄이 마음에 안들면 주로 dd를 사용한다.
때로 여러 줄을 지우고 싶으면 d숫자 + 방향 방식으로 지워나간다. 꽤 직관적인 방법이라 쓰기 편하다.
d는 물론 delete의 약자이다.
또한 ex모드에서 [:3,5d ] 명령어로 삭제가 되는데 이 경우 3에서 5번째 줄까지 삭제한다는 의미이다. (필자는 잘 사용 안한다.)

※ 위 명령어들은 모두 명령어 모드 에서 사용가능한 것이다. 명령어가 연속적인 문자인 경우 연속으로 누르면 된다. -.-
    ex) dd ▶ d 눌렀다가 d

삭제 명령을 잘못 사용하면 열심히 작성한 소스가 실수로 지워지는 경우가 발생한다. 그경우에는 윈도우처럼 되돌리기, 즉 Undo 명령어가 존재한다. u를 누르면 간단하게 전단계 복구가 가능하다. 물론 undo의 약자이고 전단계만 기억되는 것이 아니라 연속으로 누를 경우 꽤 오래전 것 까지 복구가 가능하니, 알아두어야 하고 쓰일 곳이 분명히 온다.

이와는 반대로 . 은 u와는 반대로 전의 명령을 그대로 다시 실행한다. (오른쪽 shift옆의 점-point 키임)

삽입과 삭제를 알았으니 이제는 명령모드에서 자유롭게 커서 이동 에 대하여 알아볼 차례이다.
윈도우의 경우 마우스로 가거나 페이지 다운, 업, 홈, 엔드 키로 이동이 직관적으로 가능하였으나, vi에서는 생각처럼 움직이지 않으니 답답할 따름이다. 특히 한 100줄짜리 소스를 편집하는데, 마지막 행을 바꿔야하는 상황이다. 이때 맨 끝으로 가는 단축키를 모른다면 키보드의 아래방향키로 100을 눌러줘야할것이다. 이런 상황이 반복되면 컴퓨터를 부쉬고 싶은 심정이다.(경험담)
그렇기 때문에 커서이동의 단축키는 필수적으로 알아두어야 한다.

기존방향키는 h,j,k,l이 각각 사용되었으나 현재는 VIM에서 키보드의 방향키로 이동이 가능하다.(물론 두개다 이용가능)
w : 다음 단어의 처음 문자로 이동한다.
b : 전 단어의 처음 문자로 이동한다.           
//w, b는 줄이 길 경우 사용된다.
$ : 현재 열의 맨 마지막으로 이동한다.
^ : 현재 열의 맨 처음으로 이동한다.  
// $,^는 가장 많이 쓰이는 기능! 열 편집이나 복사를 위해 쓸일이 많고 편하다.
H : 현재 화면의 상단으로 이동한다.
M : 현재 화면의 중단으로 이동한다.
L : 현재 화면의 하단으로 이동한다.  
//대문자기 때문에 결국 shift + 알파벳을 눌러야한다. 현재 화면상에서 이동하기 쉽다.

gg : 화면의 처음으로 이동한다.
G : 화면의 맨 마지막으로 이동한다.
숫자 G : 해당 숫자에 해당하는 Line으로 이동한다. 
  //g는 Go의 약자이다. 대문자로 사용됨을 유의하자.
            ex) 16G : 16 Line으로 커서가 이동한다.

필자의 가장 불편했던 vi의 기능중 하나는 해당 라인으로 바로가는 기능이었다. 해당 라인으로 바로가는 단축키가 분명히 있을 것이라고 생각했는데, 이번에 포스팅을 하면서 g라는 옵션을 사용한다는 사실을 알게되었다. 그리고 몇번 사용했는데 해당라인으로 커서가 바로 가는 기능은 윈도우 에디터에 없는 정말 편한기능이다.!(vi에서는 세번만 누르면 바로가니 엄청 편하다.)

그리고 추가로 필자도 정말 궁금했던 것인데.....
바로 Line출력하는 것이다.


<Line 설정안함 : [: set nonu] >



<Line 설정함 : [: set nu] >

위에서 언급한 것 같이 Ex모드에서 set nu명령어를 이용하여 Line Number를 설정할 수 있다.
Line Number가 설정되면 G를 이용해서 움직이기도 편하고 [: 3,5 cp 7] 같은 ex모드 명령어 처럼 줄단위로 복사하기도 편리하다.

Ctrl+f : PgDn과 같은 효과로 한화면을 넘긴다. f는 forward의 약자로 이다.
Ctrl+b : PgUp과 같은 효과로 한화면을 앞쪽으로 넘긴다. Back의 약자이다.

이 두가지도 코드가 어느정도 길어지면 넘겨 보기 효과적이다. G명령어로 해당 라인을 찾아가는 것은 이미 라인을 알고 그 부분을 수정하러 갈때이지만 그렇지 않고 소스를 흝어볼때는 필수적으로 사용된다.

다음으로 알아야할 기능은 바로 Copy & Paste 기능이다.
윈도우에서는 블록을 설정하여 그 유명한 ctrl+c,v를 이용하여 행했으나 약간 다르다.
초기 vi에는 없었지만 다행히 Vim에서는 Visual 블럭 지정기능이 있기 때문에 복사가 편한 편이다.

yy,Y : 한줄을 복사한다.
y[숫자] + 방향키 : 숫자만큼의 줄 또는 문자를 복사한다.
                          ex) y3 ↓ 해당 커서와 그 아래 3줄을 복사한다.
                                y3 → 해당 커서부터
오른쪽으로 3칸을 복사한다.
p : 현재 커서의 아래 부분에 Paste(붙여넣기) 한다.


이러한 기능은 ex모드에서 꽤나 편리한 방법으로 제공된다.
예를 들면 [ : 1,3 co 5 ] 의 의미는 1에서 3까지를 5번 Line아래에 삽입하는 의미이다.
추가로     [ : 1,3 m 5 ] 은 1에서 3까지 5번 Line아래로 이동하라는 것이다.


Vim에서는 편리한 블록지정을 위해 Visual 블럭지정 기능이 있다.
이는 윈도우에서 shift를 누른 후 지정하는 방식과 동일하다. 하나 특이한 점은 블럭 설정중 블럭단위 블럭지정이라는 재미있는 기능이 있다.

v : 단어단위로 블록을 설정한다. 방향키로 블록이 지정 가능하다.
Shift+v : 라인단위로 블록지정이 가능하다. 라인 전체가 선택되고, 방향키로 블록이 지정 가능하다.


Ctrl+v : 블럭단위의 4각형모양으로 블럭지정이 가능하다.


위와 같이 블럭단위로 편집을 하게 되면 이외로 편리한 일이 많을 것 같다~. 같은 명령어가 앞에 반복될 때 유용할 것이다.
v를 이용하여 범위를 지정하고 y를 누르게 되면 복사가 완료된 것이다. 원하는 위치에서 p를 누르면 아래쪽에 코드가 붙여넣기 된다.
또한 블록 설정상태에서 w, b, ctrl+f, ctrl+b등 커서이동 및 스크롤 이동도 같이 적용된다.


다음은 Ex모드 에서 사용되는 주 기능을 알아보자.

크게 몇 가지 기능은
1. 파일 검색 및 치환
2. 다른 파일 삽입
3. 저장 및 종료

가 있다.

파일 검색의 경우 [:/찾을 단어/] 를 이용한다.


위는 : /printf/의 ex모드상의 명령어를 이용하여 printf를 검색한 것이다.
검색이 도면 화면처럼 누런색으로 공간이 나온다. (2개의 printf가 검색되었다.)
이때 n을 누르면 다음에 있는 검색된 단어로, N을 누르면 이전의 검색된 단어로 이동하게 된다.

치환의 경우는 [조인시 위키]의 홈페이지에서 확인해보자.
[http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Development/Env/UsedVim#AEN240]



다른 파일을 삽입하기 위해서는 [ : r 파일이름 ]을 사용한다.
예를 들어


라고 입력한다면
같은 폴더내의 forktest.c의 모든 코드가 현재의 열고 편집하고 있는 곳에 복사된다. 복사되는 위치는 현재 커서의 아래쪽이다.



다음은 종료 및 저장 이다.
필수적으로 가장 많이 쓰일 명령어이니 당연히 알고 있어야 한다.
:w                    : 현재 파일을 저장한다.
:w [파일명]       : 파일명으로 파일을 저장한다.
:q                     : 저장하지 않고 종료한다.
:wq                   : 저장하고 종료한다.
:q!                    : 저장하지 않고 강제종료.       가끔 q로 안되면 이렇게 한다.
ZZ                    : 명령모드에서 이 방식으로 저장후 종료가 가능하다.


필자는 wq를 가장 많이 사용했었다. 흠...

마지막으로 다음 사이트에서는 개발자를 위한 VIM사용팁이 친절하게 설명되어 있다.
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Development/Env/UsedVim#AEN277
이중에서 몇 가지 가장 유용하게 쓰일것 같은 것 몇가지만 언급하겠다. 나머지는 직접 링크타고 둘러보시길 바란다.^^

첫번째로 창 나누기 기능 이 있다.
창을 나누면 마치 윈도우 창을 여러개를 실행시킨후 alt+tab을 사용한 것같은 기능이다.
창을 나누어 사용하면 두개의 파일간에 복사 및 붙여넣기도 원활하게 할 수 있다. 창 띄우기는 2개이상도 가능하다.


위와 같이 창을 나누어서 자유롭게 사용할 수가 있다.
필자는 보통 윈도우 에서 telnet을 통해 linux계정에 접속해서 사용하곤 하는데,(집 PC에 리눅스 설치 않했다....)
그냥 윈도우의 콘솔창을 이용하면 화면크기에 제약이 있어 많이 불편하다.
그래서 Zterm이라는 유닉스 접속 프로그램을 사용하면 창 나누기 기능을 편리한 이너페이스로 사용이 가능하다.
창을 나누는 법은
처음 하나의 파일을 작성중인 상태에서
: split [파일명]                        ->         가로로 행을 나눈다.          
: vs [파일명]                          ->          세로로 열을 나눈다.

위 예제의 경우 vs를 이용한 경우이다.

이렇게 창을 나눈 상태에서 옆에 있는 편집으로 이동하기위해서는 Ctrl+W+W를 누르면 옆창으로 이동된다.
서로간에 클립보드, 즉 버퍼에 저장되었던 복사한 내용들이 서로에게 그대로 전달된다.
이제는 무식하게 일일이 보고 다시 작성하거나, 윈도우에서 복사하고 리눅스로 전송하여 쓸일은 없을 것이다.^^

두번째로 Vi 중단하기이다.
Ctrl+z를 이용하여 잠시 편집기를 멈춰둘 수 있다. 정지시키면 나중에 복귀하여 다시 작업을 할 수 있다.
마치 윈도우의 창 활성화/비활성화와 같은 개념으로 보면 되고, 쉘로 (프롬프트창으로) 돌아와서 ls로 폴더내용을 보거나 man을 이용하는등 이런저런 작업을 할 수 있다.
여기서 알아둬야할 것은 fg를 통해 다시 중단했던 작업으로 복귀할 수 있다는 것이다.(쉘창에서 누르는 것이다.)

세번째로 Man page 확인하기 이다.


man page는 유닉스 상에서 볼 수 있는 라이브러리 메뉴얼이다.
가끔.. 아니 자주 보게되는데,
매번 저장후 또는 정지후 쉘로 돌아가서 man 명령어를 일일이 쳐야 했다.
하지만 이번에 알게된 기능으로 해당 함수에 커서를 올려놓고 Shift+k 를 누르면 자동으로 man이 실행되고 man 페이지를 다 보게되면 다시 코드작성 부분으로 돌아가게 된다.

네번째로 함수,변수 자동완성 이다.
이는 Visual Studio 에서 자동완성기능과 비슷하다.
해당 함수나 변수에서 다쓰지 못했을 경우 Ctrl+p 를 누를 경우 include된 곳에서 선언된 함수나 변수를 자동으로 찾아서 목록을 보여준다.
개인적으로 이 기능을 알게 된게 정말 대박이라고 생각한다.^^
이거 참 유용하게 쓰일듯하다


<한번 gethost까지만 쓰고 Ctrl+p를 눌렀을 때 나온 것들이다.>


다섯번째 네비게이션 기능 이다.


위에서는 네비게이션을 적용한 것으로 왼쪽에 현재 내용들이 보인다.
사용법은
[:20vs./  ]
로 사용하면된다. 원리는 창 나누기에 기인한다. 창을 20:x로 나눈후 20쪽에 현재 위치 ./을 할당해 주는 것이다.
그러면 현재 파일들의 상태를 볼 수 있다. 디렉토리간 이동도 가능하여 편하고 오른쪽에서 창을 다시 나눈후 로드할 수도 있다.




그밖에 더 자세한 / 세부적인 기능들은 많다.
초보자라면 이러한 기능들을 다 흝고, 연습해야할것이고, 중급자라면 이정도는다 사용할 것이라고 생각된다.

더 세세한 기술문서를 보고 싶다면 ,
Vim 공식 싸이트에서 더 좋은 정보를 얻을 수 있다.
http://www.vim.org/index.php
돈이 여유롭다면, 기부도 좀 하자. 우간다의 어린아이들에게 양식을..........!

'무언가 만들기 위한 지식 > Etc' 카테고리의 다른 글

VIM 환결설정(.vimrc)  (3) 2010.04.19
ASCII CODE(아스키 코드)  (5) 2010.02.20