3. The power of ex

제가 생각하기에 vi가 강력한 에디터가 될 수 있었던 가장 큰 이유가 이 ex 모드 때문인 듯합니다. ex모드는 vi에 여러 가지 확장된 기능과 외부 프로그램을 사 용할 수 있는 통로를 제공합니다. 셀 명령은 기본이고, 유닉스의 기본적이고 유용한 유틸리티를 사용할 수 있습니다.
    ex 명령의 형식
	:<범위> ex명령어 [| 명령 ...]
우선 ex명령은 행 단위로 명령이 실행된다고 알아두시기 바랍니다.(원래 ex 에디터가 라인단위 에디터죠) 이렇게 이해하는 것이 가장 쉽습니다. 범위 설정도 물 론 행 단위로 설정이 되겠지요? 범위를 설정할 때는 ,로 구분해서 시작과 끝을 나타 냅니다. 즉 1, 10 이면 1~10행에 대해서 명령을 적용한다는 것입니다. 만약에 생략하 면 현재 위치한 행이 해당됩니다. 제가 위에서 찾기 명령이 어떻게 사용될지 생각해 보라고 했던 얘기가 기억이 나십니까? 범위 내에서 명령을 수행할 수도 있지만 어떤 찾기를 한 후에 그 줄에, 혹은 어떤 처음 줄을 주어주고 찾기가 성공한 줄까지 ex명 령을 수행할 수 있다는 얘기가 되는 거죠... 자세한 것은 역시 뒤에서 나오는 예에서 찾아보시기 바랍니다.
:d	삭제
:co, t	복사
:m	이동
:pu	붙여 넣기
:y	버퍼에 복사
:=	현재 행번호 표시(버전에 따라 틀림)
:p	줄의 내용을 표시
예를 들어가면서 설명을 하겠습니다. :1, $d (문서 전체의 삭제) $기호는 문 서의 끝을 나타냅니다. 정규표현식의 마지막에서는 줄의 끝을 나타내고 명령모드에서 도 줄의 끝을 나타내죠. $기호를 알아두시라 예를 들었습니다. :%d (문서 전체의 삭 제) %기호는 문서 전체를 나타냅니다. 위에서 쓴 식과 같은 일을 하지만 훨씬 짧아졌 죠. :.,+10y (현재 위치에서 10행 아래까지 버퍼에 복사) 버퍼에 복사만 합니다. :.,+10y|$|pu (현재 위치에서 10행 아래까지 버퍼에 복사, 마지막줄로 이동, 붙여넣 기) | 기호를 사용하면 한 행에 여러 개의 ex명령을 써줄 수 있습니다. :.m$ (현재 줄을 잘라낸 후 줄의 맨 마지막에 추가) :-, +y (현재 줄과 위, 아래 줄을 복사) +- 기호를 사용하는 방법을 설명하고 있습니다. 현재 행에서 -는 위쪽을 +는 아래쪽 행 을 의미하죠. :.,'xd (현재 줄에서 x에 마크한 줄까지 삭제) 마크를 통한 이동 중에 서도 'X 로 이동하면 행단위로 이동하는 것을 위에서 설명을 했었죠. ex모드에서도 바로 마크를 이용할 수 있습니다. ''등의 기호도 당연히 사용이 가능합니다. 단 행단 위니까 `는 무효합니다. :., /pattern/d (현재 줄에서 pattern이 처음 나타나는 줄까 지 삭제) 검색을 이용하여 범위를 지정하는 방법입니다. 단 이렇게 지우면 패턴이 나 타난 줄까지 삭제된다는 점에 유의하시기 바랍니다. :.y a (현재 줄을 named buffer a에 저장) named buffer도 역시 사용이 가능합니다. 복사 할 버퍼를 지정하여 yanking 을 하였습니다. 이를 불러낼 때에는 :pu a (버퍼 a에 복사된 것을 붙이기) 또는 ap 로 하면 되겠죠... :.co$ (현재 줄을 복사해서 줄의 마지막에 붙이기) :/pattern/= (패턴이 나타난 줄 번호를 표시), :10+20d (10번째 줄에서 +20까지 삭제) 이는 현재 위치가 10 행 이외일 때 지정한 10줄에서 +20까지 지운다는 의미입니다. :10,+20d로 하면 뭐가 달라질까요? 이렇게 하면 10행에서 현재 행에서 20을 더한 줄까지 지운다 는 의미가 됩니다. 더 깊이 들어가시고 싶으신 분은 문서를 편집할 때 ex모드로 편집 을 해보시기 바랍니다. ex [filename]하시면 됩니다. 이렇게 해보시면 좀 갑갑하겠지 만 ex명령어를 확실히 익히실 수 있으리라 생각합니다.

3.1. abbreviations

이 기능도 잘 쓰면 매우 유용한 기능입니다. 긴 문자열을 약어 입력으로 얻 어내는 것이죠. 다른 방법으로는 자주 타이핑되는 오타와 정타를 묶어서 자동 수정 기능을 하게 하는 것입니다. 역시 예를 들어 설명을 하죠. :ab univ. university 라 고 해 둡시다. 편집모드에서 univ.라고 입력하고 white character를 입력하는 순간 univ.가 university로 바뀔 것입니다. 내가 the를 teh라고 자주 오타를 낸다면 :ab teh the를 등록해 두면 되겠죠.

3.2. map, map!

이 기능도 매우 유용합니다. 매크로를 만들어 쓸 수 있도록 도와줍니다. 우 선 특수키의 입력에 대해서 알고 넘어갑시다. ex에서 [ctrl]-v를 누르고 [enter]를 누르면 ^M이라고 표시될 것입니다. 이 문자가 [enter]를 나타냅니다. 비슷하게 [ctrl]-v를 누르고 특수키를 누르면 해당하는 문자가 표시됩니다. map으로 정의해 놓 은 키 입력은 명령모드에서 동작을 하고 map!로 만들어 놓으면 편집모드에서 사용할 수 있게 됩니다. [esc]키가 너무 멀어서 누르기 힘드신 분은 :map! ^H ^[ 로 해 보시 기 바랍니다. [bs]키를 누르게 되면 편집모드에서 명령모드로 바뀌게 됩니다. 자주 사용하지 않는 키를 매핑해서 사용할 수 있겠지요. 처음 시작만 명령어 모드에서 사 용하고 편집모드에서 사용한다는 의미가 있을 뿐 키 입력을 그대로 대신해 주므로 실 제로는 두 모드간을 자유롭게 넘나들 수 있습니다. 즉 :map & I/*^[A*/^[ 이렇게 해 놓으면 &키를 누르면 현재 줄을 C문의 주석으로 만들어 버립니다. 이 명령에서는 삽 입과 명령 모드를 두 번이나 넘나들었죠. Function키에 대해서도 이러한 매핑하는 것 이 가능한데 차례로 #1 ~ #9 번이 function키를 나타냅니다. :map #1 commands 이런 형식입니다. 아니면 위에서 했던 것처럼 [ctrl]-v 다음에 function키를 눌러서 입력 을 받아도 됩니다. 아니면 [F1] ~ [F9]를 대신 써주어도 되고 (이

에 값은 /etc/termcap 에 정의되어야 합니다.)

3.3. @-function

Named buffer를 이용한 macro입니다. 개념은 매우 간단한 것이죠. insert모 드에서 매크로로 사용할 키 입력을 그대로 친 후에 add ayy등의 형식으로 named buffer a에 저장을 합니다. 이 매크로를 불러서 쓸 때 @를 앞에 쓰고 뒤에 버퍼명을 씁니다. 즉 @a라고 치게 되면 아까 만들어서 a버퍼에 넣었던 키 입력이 그대로 반복 되는 것이죠. @@라면 마지막에 버퍼에 들어간 것을 실행하게 됩니다. 허 이건 ex명령 과 별 관계가 없는 글이군요. 쩝~ 수정하려면 차례도 수정하여야 하는 ... --

3.4. shell command

우선 다른 에디터에서처럼 shell모드로 빠져나가려면 :sh 라고 입력하면 됩 니다. 다시 복귀하려면 [ctrl]-d를 누르면 다시 vi로 되돌아 오게 됩니다. 하지만 vi 는 shell로 나가지 않고 ex에서 바로 shell상의 명령을 실행 시킬 수 있습니다. 바로 ! 기호를 이용합니다. !gcc -c % 이런 식도 가능하겠죠. :r !ls라고 쳐 봅시다. ls가 실행되고 그 결과가 지금 위치에 덧붙여집니다.
total 18
drwxrwxr-x 2 nu11 nu11 1024 May 25 22:01 .
drwx------ 11 nu11 nu11 2048 May 25 22:01 ..
-rw------- 1 nu11 nu11 12288 May 25 22:01 .vi-beginner.txt.swp
-rw-rw-r-- 1 nu11 nu11 14 May 25 21:59 test
-rw-rw-r-- 1 nu11 nu11 1583 May 25 22:01 vi-beginner.txt
같은 방법으로 자체적인 정렬을 하는 명령은 없지만 sort라는 강력한 소트 프로그램을 이용할 수 있습니다. sort에 대한 자세한 내용은 다른 책을 참고 하시길 바라고, 다음과 같이 간단한 예만 들어보이도록 하겠습니다. 위의 내용을 크기에 따 라서 정렬을 해 볼까요?
:2,$ !sort +4

total 18
-rw-rw-r-- 1 nu11 nu11 14 May 25 21:59 test
drwxrwxr-x 2 nu11 nu11 1024 May 25 22:01 .
-rw-rw-r-- 1 nu11 nu11 1583 May 25 22:01 vi-beginner.txt
drwx------ 11 nu11 nu11 2048 May 25 22:01 ..
-rw------- 1 nu11 nu11 12288 May 25 22:01 .vi-beginner.txt.swp
자 이제 많고 많은 유닉스 셀 명령어들을 모두 사용할 수 있습니다. 무엇을 더 할 수 있을지는 ... ^^ 4.5 set, 자신에 맞는 vi 만들기 자신의 작업환경에 맞게 vi를 세팅하는 법입니다. 우선 set할 수 있는 목록 은 set all하면 주루룩 스크롤이 되면서 올라갑니다. 하나씩 설명하면 지금까지 써온 것 만큼이나 써야 할 것 같네요. ^^ 시간이 나면 나중에 추가하도록 하죠... set nu 화면의 좌측에 행번호를 출력합니다. set ruler 커서의 위치가 우측 하단에 표시됩니다. set aw , set ai ...저는 위에 것들을 자주 사용하는군요. 한가지만 언급하고 넘어가죠. 저도 처음에 몰라서 고생 좀 했죠. set aw 등 으로 세팅을 했다면 이에 대한 해제는 set noaw 이런 식으로 앞에 no만 붙이면 된다 는 겁니다. -- ( 자우랑 : 저도 이 기능을 상당히 좋아합니다 :) )

3.5. 연습문제

(1) 현재 커서가 위치한 라인을 주석으로 만드는 @-function을 만들어라.