제가 생각하기에 vi가 강력한 에디터가 될 수 있었던 가장 큰 이유가 이 ex 모드 때문인 듯합니다. ex모드는 vi에 여러 가지 확장된 기능과 외부 프로그램을 사 용할 수 있는 통로를 제공합니다. 셀 명령은 기본이고, 유닉스의 기본적이고 유용한 유틸리티를 사용할 수 있습니다.
ex 명령의 형식 :<범위> ex명령어 [| 명령 ...] |
:d 삭제 :co, t 복사 :m 이동 :pu 붙여 넣기 :y 버퍼에 복사 := 현재 행번호 표시(버전에 따라 틀림) :p 줄의 내용을 표시 |
이 기능도 잘 쓰면 매우 유용한 기능입니다. 긴 문자열을 약어 입력으로 얻 어내는 것이죠. 다른 방법으로는 자주 타이핑되는 오타와 정타를 묶어서 자동 수정 기능을 하게 하는 것입니다. 역시 예를 들어 설명을 하죠. :ab univ. university 라 고 해 둡시다. 편집모드에서 univ.라고 입력하고 white character를 입력하는 순간 univ.가 university로 바뀔 것입니다. 내가 the를 teh라고 자주 오타를 낸다면 :ab teh the를 등록해 두면 되겠죠.
이 기능도 매우 유용합니다. 매크로를 만들어 쓸 수 있도록 도와줍니다. 우 선 특수키의 입력에 대해서 알고 넘어갑시다. 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 에 정의되어야 합니다.)
Named buffer를 이용한 macro입니다. 개념은 매우 간단한 것이죠. insert모 드에서 매크로로 사용할 키 입력을 그대로 친 후에 add ayy등의 형식으로 named buffer a에 저장을 합니다. 이 매크로를 불러서 쓸 때 @를 앞에 쓰고 뒤에 버퍼명을 씁니다. 즉 @a라고 치게 되면 아까 만들어서 a버퍼에 넣었던 키 입력이 그대로 반복 되는 것이죠. @@라면 마지막에 버퍼에 들어간 것을 실행하게 됩니다. 허 이건 ex명령 과 별 관계가 없는 글이군요. 쩝~ 수정하려면 차례도 수정하여야 하는 ... --
우선 다른 에디터에서처럼 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 |
: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 |
(1) 현재 커서가 위치한 라인을 주석으로 만드는 @-function을 만들어라.