|
안녕하세요? (예비)고수 여러분. 이번 호에서는 마지막으로 vi를 쓰는데 있어서 알아두면 무지무지 유용한 기능을 정리해 드리고 마치겠습니다. vi 하나 가지고 석 달씩이나 떠들 게 뭐가 있냐는 분들도 계실지 모르겠습니다. 그렇지만 유닉스에서 편집 작업을 많이 하시는 분이라면 평소 편집기의 기능이 변변치 못해서 아쉬운 점이 많았을 겁니다. 그런데 제가 유닉스를 쓰면서 항상 느끼는 것이 있습니다. 그것은 문제의 근원이 대개 프로그램의 기능이 딸리는 것보다는 사용법을 잘 모르는데 있다는 겁니다. 특히 vi가 그런 프로그램 중 하나입니다. 혹시 지금 옆에서 뭐, vi 같은 걸로 끙끙 대냐고 비아냥거리는 친구가 있다면 지난 호까지 다룬 것들 중에서 하나 골라 물어보세요. 너 이거 아느냐고. vi에 대한 글을 연재하는 동안(특히 우리나라에서)리눅스 세계에는 큰 변화가 있었습니다. 리눅스의 사용자 층의 확대에 크게 기여했다고 할 수 있는 레드햇 배포본의 5.0 버전이 발표되었고, 여기에 한글 기능을 보강한 알짜 레드햇 5.0도 발표되었습니다. 요즈음 동호회 게시판마다 이 새로운 버전에 관한 이야기들이 활발히 오가고 있더군요. 그렇지만 무엇보다도 한동안 업그레이드가 중단되었던 한텀(hanterm)이 다시 나오기 시작했다는 점이 반가운 일입니다. 리눅스에서 한글을 다루는데는 아직도 크고 작은 문제가 많이 있습니다.(이 강좌에서 든 예가 모두 영문으로 되어있다는 것도 그 때문입니다.) 이 문제를 해결하기 위해 자기 시간과 노력을 쪼개가며 애쓰시는 분들께 항상 감사하는 마음을 갖고 있지만 아직도 부족한 감이 있고 이는 리눅스를 쓰고 있는 우리 모두의 책임입니다. 기존의 상용 운영 체제는 판매를 위해서 프로그램부터 글꼴까지 모두 외국 주도로 이루어지는 경향이 있지만, 리눅스에서는 우리가 직접 할 수밖에 없거든요(이점은 오히려 다행일 수도 있습니다.). 여러분 모두가 리눅스의 고수가 되어서 리눅스 한글화의 발전을 앞당겼으면 합니다. 명심하세요. 리눅스는 모든 사용자가 동시에 개발자라는 것을. 내 손으로 프로그램을 짜야만 개발이 아닙니다. 많이 쓰고 관심을 가질수록 좋은 제품이 나오게 되어있으니까요. 그런 의미에서 우리 모두 파이팅!! 지난 호에서는 우리 모두 잠깐 프로그래머가 되었었습니다. hello 프로그램이었지요. 뭐, 상용화는 어렵겠지만, 어찌 됐건 그건 위도우 95보다(심지어는 리눅스보다도) 안정적으로 도는 완벽한(?) 프로그램이었습니다. 이번에는 또 다른 프로그래밍 언어를 써 봅시다. 사실 이것은 가장 독특한 언어입니다. 바로 LaTeX입니다.(라텍 또는 레이텍이라고 읽습니다.) 먼저 우리가 지금까지 가지고 놀았던 문서를 다시 꺼내 봅시다. Installation-HOWTO 말입니다. 그림 1을 보세요. :set nu<CR> 명령을 써서 왼쪽에 행 번호가 나오도록 한 것입니다. 우리가 할 일은 이 문서 중 일부를 발췌해서 LaTaX 문서로 만드는 겁니다. 우선 5번부터 22번째 줄까지를 떼어내겠습니다. 아래아 한글에서 쓰는 블록 저장 기능이 있다면 좋겠지요? 물론 있습니다. : 5, 22w sample.tex<CR> 을 입력해 보세요. 잠깐, 지난번까지 실린 글을 본 친구 하나가 그런 말을 하더군요. 이렇게 써놓으면 어떤 사람은 <, C, R, >을 순서대로 친다고요. 흔히 쓰는 표현이라, 그땐 웃어 넘겼는데 한편으로는 그럴 수도 있겠다 싶었습니다. 솔직히 제가 초보였던 시절(지금도 별 차이 없지만)이 생각나서요. 뒤늦게나마 말씀드리는 데, 이건 캐리지 리턴(carriage return)이라는 뜻입니다. 그냥 키보드의 <Enter> 키를 치라는 의미라고 생각하시면 됩니다. <Esc>, <Enter>는 분명히 아실 테지요. 자, 다시 되돌아가서, :w sample.tex<CR>이라면 이미 배운 것입니다. 단지 : 와 w 사이에 5,22 라는 숫자가 있는데 이건 그 뒤에 오는 명령(여기서는 w)이 적용될 범위를 나타내는 것입니다. 따라서 이 명령은 5번째 줄부터 22번째 줄까지의 내용을 sample.tex 에 저장하라는 의미입니다. 이제 :e#를 써서 우리가 새로 저장한 파일로 옮겨가 봅시다. :set nonu<CR> 명령으로 행 번호를 없애세요. 당장은 필요 없으니까요. LaTeX의 장점은 문서의 내용을 입력할 때, 우리가 흔히 다루는 텍스트 파일 형태로 작업을 한다는 점입니다. 언뜻 보면 아래아 한글이나 워드처럼 GUI 환경에서 입력, 편집, 출력이 모두 이루어지는 것보다 불편하기만 할 것 같지만, 여기에도 장점이 있습니다. 내용에만 집중할 수 있다는 것입니다. 사실 요즈음의 워드 프로세서에서 제공하는 스타일 등의 기능은 이런 장점을 도입한 것입니다. 그럼 실제로 간단한 텍스트 파일을 LaTeX 파일로 바꾸어 보겠습니다. 그림 2와 같이 문서의 처음과 끝에 몇 줄 추가한 후 저장하세요. 그 다음에 셸 프롬프트에서 latex sample 이라는 명령을 실행하면 됩니다(물론 LaTeX 이 설치되어 있어야겠지요). vi를 빠져 나올 필요도 없고 새로 터미널을 열 필요도 없습니다(그럼 어떻게??). :!latex sample<CR> 이라고 하면 됩니다(이제 기억 나세요?). 제대로 되었다면 이제 sample.dvi 라는 파일이 만들어졌을 겁니다. 확인하려면? 역시 :!ls<CR> 라고 하면 간단히 알아볼 수 있지요. 만일 여러분이 X 윈도우에서 xterm 이나 hanterm 같은 터미널 에뮬레이터를 이용하여 작업중이라면 처음의 멋 대가리 없는 텍스트 파일이 어떻게 변신했는지 다음과 같이 알아볼 수 있습니다. :!xdvi sample &<CR> 그림 3처럼 나왔나요?(그럴 듯하지요?) 하지만 여러분이 문서의 내용을 고치고자 한다면 여전히 처음의 텍스트 파일을 수정하면 됩니다. 수정하고, latex로 dvi 파일을 만들고, xdvi로 보고, 프린트로 출력하는 것도 가능합니다. 여러분의 시스템에 프린터 설정이 잘 되어있다면 :!dvips sample<CR> 명령으로 간단히 프린터로 출력해 볼 수 있습니다. 또는 :!dvips sample -o<CR> 명령으로 포스트스크립트 파일(sample.ps)을 만든 후 gv 같은 프로그램을 써서 화면으로 출력할 수도 있습니다. DVI 와 PS 파일은 유닉스 세계에서 문서를 저장하는 용도로 아주 흔히 쓰이는 파일 포맷입니다. 리눅스를 쓰는 초보자들이 정보가 부족하다고 불평하는 일이 흔한데 사실은 정보가 너무 많이 주체할 수 없을 정도입니다. 우리의 Installation-HOWTO 도 그 중의 하나인데 이 파일이 있던 /usr/doc/HOWTO 디렉토리에는 그 외에도 많은 문서들이 아스키 파일 포맷으로 제공됩니다. /usr/doc/HOWTO/other-format 디렉토리에는 같은 파일들이 DVI, PS, HTML 포맷으로 제공됩니다. 리눅스를 쓰다가 갖게 되는 대부분의 궁금증을 해결해 주기에 충분한 문서들입니다. 물론, 영어로 되어있는게 문제이긴 하지만, 요즘은 한글로 번역하는 작업이 진행되고 있다니 부지런한 분들은 많은 정보를 구해볼 수 있을 겁니다. LaTeX 은 아주 유용하지만, 그만큼 복잡한 언어이기도 합니다. 관심 있는 분들은 도전해 보시기 바랍니다. 이제 다시 vi 와 Installation-HOWTO 문서를 가지고 놀아 봅시다. 다음과 같이 입력해 보세요. :.,+4!fmt -60 흔히 문서 중에 인용부를 넣을 떄는 그 문단의 폭을 다른 곳보다 좁게 하지요? 그림 4를 보세요. 이미 다 배운 것 같기도 하고 아닌 것 같기도 하지요. 우선 처음의 :.,+4는 앞서 보인 :13,17과 비슷하군요. 13과 17이 각각 시작 행과 끝 행을 나타낸다는 점을 생각해보면 .와 +4도 그럴 것 같은데... 행 번호를 나타낼 때 .를 쓰면 이건 현재 커서가 있는 행을 의미합니다. 그럼 뒤의 +4는 무엇을 나타낼까요? 짱구 굴리는 소리가 요란하군요. 예, 맞습니다. 앞에 나온 행 번호 +4를 뜻합니다(vi를 배우면서 찍는 실력도 많이 늘었을 겁니다). 어렵지 않지요?(그럼, -5는 무슨 뜻일까요?) fmt는 포맷 명령어입니다. 디스크 포맷이 아닙니다. 문서의 포맷을 말하는 건데 그렇다고 DVI 나 PS 같은 포맷을 얘기하는 것도 아니고 말 그대로 문서의 "형식"을 조정하는 겁니다. 대표적인 것이 여기에서 보인 예처럼 문서의 폭을 60문자로 조절하는 것 같은 겁니다. 만일 셸 프롬프트 상에서 fmt -60 sample.tex 이라고 하면 sample.tex 파일 전체의 내용을 60 문자 폭으로 조절한 후 표준 출력(쉬게 말해 터미널 화면)으로 보냅니다. 여기서 잠깐 필터링에 대해 말씀드리겠습니다. 필터란 뭔가를 걸러낸다는 뜻입니다. 유닉스에서는 특별한 의미로 쓰이는데 표준 입력(쉽게 말해 키보드)으로부터 데이터를 받아서 가공한 후 표준 출력으로 내보내는 프로그램을 말합니다. 대표적인 명령으로 cat 이 있지요(이건 아무 것도 안하고 입력된 데이터를 그대로 출력해 버립니다.) 흔히 텍스트 파일의 내용을 볼 때 cat foo 와 같이 쓰지요. 파일 이름을 인수로 줄 경우 대개의 필터는 표준 입력 대신 그 파일을 입력 데이터로 씁니다. 이제 위의 명령이 대충 어떤 요소로 구성되어 있는지 아셨을 겁니다. 정말 중요한 것은 !입니다. 이미 :w!에서처럼 !는 vi가 거부하는 명령을 억지로 시킬 때 쓴다고 배웠습니다만 이번에는 필터링 기능을 수행합니다. 다시 정리하면 위의 명령은 지정된 영역의 데이터를 !뒤에 오는 필터 명령을 통과시킨 후 그 출력으로 원래의 데이터를 대체시키는 것입니다. 여기서 '지정된 영역'이란 .,+4로 정의된 영역을 의미합니다. 현재 커서가 있는 줄을 나타내는 .는 생략될 수 있습니다. 즉, .,+4는 ,+4와 같고 -3,+5는 현재 커서가 있는 행의 위로 세 번째 행부터 아래로 다섯 번째 행까지의 영역을 나타냅니다. 그런데, 팰터링을 하는데는 한가지 방법이 더 있습니다. :를 입력하지 않고 바로 문서 안의 특정 영역을 지정한 후, !필터 형식을 써서 문서의 내용 중 일부를 원하는 형태로 수정할 수 있습니다. 명령 모드에는 행편집(line-editin진다고 할 수 있지요. 마찬가지로 비주얼 모드에서도 필터링이 가능g) 모드라는 것이 있습니다. 이미 배운 : 로 시작하는 명령들이 여기에 해당하는데 이는 첫 회에서 잠깐 언급한 바와 같이 ed(ex)라는 행 단위 편집기(line editor)에서 유래한 것으로 맨 아래 줄로 커서가 이동하기 때문에 끝줄 모드라고도 한다고 했지요. 그 외의 경우, 그러니까 p,s,r 등의 명령을 입력하는 모드를 비주얼(visual)모드라고 합니다. 따라서 앞서 보인 필터링 명령은 행 편집 모드에서 이루어합니다. 조금 전 행 편집 모드에서 필터링한 것을 u 명령으로 취소 시킨 후 같은 위치에서 다음과 같이 입력해 보세요. !4jfmt -60 이 경우 !로 시작을 하고 현재 커서가 있는 줄로부터 "특정 줄"까지를 대상으로 한다는 점이 다릅니다. y4j가 현재 커서가 있는 곳으로부터 4줄 아래까지의 내용을 버퍼에 저장하라는 명령인 것처럼 위의 명령은 현재 커서가 있는 곳에서 4줄 아래까지의 내용을 60 문자 폭으로 조정하게 됩니다. 영역을 결정하기 위해 !!, !}, !G 와 같은 방법을 쓸 수도 있는데, 이건 현재 줄만, 현재 줄부터 문단 끝까지, 현재 줄부터 문서 끝까지(G 명령을 상기하세요)를 나타냅니다. 일단 !로 시작해서 영역 설정을 위한 입력이 끝나면 바로(마치 행 편집 모드에서처럼) 커서가 화면 맨 밑으로 이동해서 필터 명령의 입력을 기다립니다. fmt 외에도 sort, cut 과 같이 유용한 필터 프로그램들이
많이 있습니다. /etc/passwd 파일은 여러분의 시스템에 등록되어 있는 모든 사용자에 대한 정보를 담고 있습니다. 매우 중요하기 때문에 일반 사용자는 볼 수만 있고 수정하거나 지울 수는 없습니다. 그 파일을 vi로 열어 보세요. 그 다음에 :1,$!cut -d: -f1,5<CR> 라고 해보세요(read-only 파일을 수정했다는 경고가 나오겠지만, 걱정 마세요. 어차피 저장은 안되니까요. 설마 슈퍼 유저로 vi 공부하는 분은 없겠지요?). 결과가 어떤가요? 사용자 ID 와 실제 이름만 남았지요? cut -d: -f1,5 는 구분자(delimiter)를 :로 하고 첫 번째와 다섯 번째 필드(fild)만을 잘라내라는 필터 명령입니다. 이러한 필터링은 필터 명령에도 응용할 수 있습니다. 이러한 필터링은 필터 명령이 아닌 일반 명령에도 응용할 수 있습니다. !!가 현재 줄의 내용을 필터링하는, 즉 현재 줄의 내용을 지우고 대신 그것을 처리하여 얻은 결과를 넣는다는 점을 이용하는 것입니다. 아무데나 빈 줄을 하나 만들고 그곳으로 커서를 옮긴 후 비주얼 모드에서 !!ls<CR> 라고 해보세요. 그 자리에 vi를 실행한 디렉토리의 내용이 들어갈 겁니다. 현재 커서가 있는 줄을 지우고 그 자리를 ls 명령의 결과로 채우는 것이지요. 이 경우 1줄을 지우고 그 자리에 여러 줄의 내용을 넣었으니 다음 줄이 밀려나면서 문서의 줄 수가 늘어났을 겁니다. ls는 아시다시피 입력을 필요로 하지 않으므로 그 내용을 무시하고 버립니다. 그렇지만 결과는 필터 명령과 같이 처리되어 원래 커서가 있던 줄로 들어갑니다. 이제 아시겠지요? 물론 !!ls<CR> 과 :!ls<CR> 이 어떤 차이가 있는지 혼돈하시지 않으리라 믿습니다(만일, 헛갈리시면 몰래 해보세요. 눈감아 드리지요) ex 명령을 다 알 필요는 없습니다만 그 중에는 비주얼 모드 명령보다 편한 것도 몇 가지 있습니다. 처음엔 GUI 가 편하다고 마우스를 쓰지만 나중에는 오히려 키보드가 편하다고 단축키를 찾는 것과 비슷하지요. :5,10 co 20<CR> 은 5번째부터 10번째 줄까지의 내용을 20번째 줄 뒤로 복사하라는 명령입니다. 마찬가지로 주소 지정은 다양하게 할 수 있습니다. :.,10 co 20<CR> 은 무엇을 의미하는지 생각해 보시기 바랍니다. 복사 대신 이동을 원한다면 :5,10m20<CR> 과 같이 하시면 됩니다. 그 외에 지우는 명령도 많이 쓰이는데 :10,20d<CR> 라고 하면 10번째 줄부터 20번째 줄까지의 내용을 간단히 지워 버릴 수 있습니다. 행 번호를 알아내는 방법은 이미 두 가지 배웠습니다. :set nu<CR> 를 이용해서 알아내는 방법과, ^G 를 이용해서 알아내는 방법이 있었지요. 전자는 문서 전체에 행 번호를 매겨서 보여주고 후자는 현재 커서가 있는 행의 번호를(다른 정보와 함께) 보여줍니다. 지난 호에서 우리는 검색 명령을 배웠습니다. 검색과 대체는 바늘과 실같은 명령이지요. :1,$s.Linux/LINUX/<CR> 라고 하면 문서 전체에서 각 행에 '처음' 나오는 Linux를 LINUX로 바꾸어줍니다. 하지만 보통은 각 행의 처음에 나오는 것만 처리하는 것보다 모두를 바꾸는게 보통일 겁니다. 그건, :1,$s.Linux/LINUX/g<CR> 라고 하면 됩니다. 만일 바꿀 때마다 일일이 확인해 보고 싶다면 :1,$s.Linux/LINUX/g<CR> 와 같이 끝에 c를 덧붙이면 됩니다. 이렇게 하면 매번 바꿀 때마다 멈춰서 물어 봅니다. 만일 그게 귀찮아지면 ^C를 눌러서 대체 작업을 중단시킬 수 있습니다. 이 대체 기능을 이용한 좋은 예로 도스용 텍스트 파일을 유닉스용으로 바꾸는 것을 들 수 있습니다. 도스 환경에서 만들어진 텍스트 파일을 유닉스(리눅스)로 가져와서 vi로 열어보면 그림 5와 같이 문단이 끝나는 곳마다 ^M 문자가 들어가 있는 것을 발견할 수 있습니다. 문서의 내용에는 영향을 주지 않지만 보기에는 아주 불편하지요 .이것은 도스와 유닉스가 줄 바꿈을 표시하는 방법이 다르기 때문에 생기는 문제입니다. 도스에서는 문서 편집중에 <Enter>키를 누르면 커서를 줄의 맨 처음으로 옮겨놓으라는 의미의 제어 문자인 CR(carriage return)과 다음 줄로 넘어가라는 의미의 제어 문자인 NL(new line)의 두 문자를 넣어 줍니다. 반면에 유닉스에서는 NL 만을 넣어 줍니다. vi 같은 유닉스용 편집기는 이 문자를 만나면 화면에 출력하는 대신 행이 바뀌는 것을 알게 됩니다. 그러나, 도스에서 작성한 문서를 열어 보면 문단이 끝나기 전에 CR 문자가 보여지게 되는데 이것이 바로 ^M 입니다. 반대로 유닉스에서 CR을 넣지 않기 때문에 생기는 문제도 있습니다. 도스에서 쓰는 프린터에 텍스트 파일을 바로 출력하면 흔히 "계단 현상"이라고 하는, 줄 바꿈을 할 때 다음 줄의 처음 위치가 아니라 현재 줄의 끝 위치에서 인쇄가 계속되는 문제가 생깁니다. 그래서 프린터 설정에서 이걸 따로 조정해 주어야 합니다. 그런데 도스용 문서에서 ^M을 없에는 것은 간단히 vi안에서 해결할 수 있습니다. :1,$s/^V<CR>//g<CR> 라고 입력해 보세요. 화면에는 :1,$s/^M//g 라고 나올 겁니다. 이것은 문서 전체에서 ^M 문자를 찾아서 없애라는 뜻이 됩니다. 여기서, 찾을 문자열(이 경우에는 한 문자)인 ^M을 ^V<Enter> 로 입력했는데, ^V는 ^M처럼 특수한 문자를 입력하는 방법으로 쓰입니다. 다른 예로 ^V<Esc>를 치면 ^[ 가 찍히지요. 이건 특수 문자인 <Esc>를 의미하는 것으로 ^와 [ 의 두 문자를 의미하는 것이 아닙니다. 바꿀 문자열 자리에 아무 것도 없는 것은 결국 찾은 문자열을 없애라는 의미가 되겠지요. 파일을 편집하다가 다른 파일을 읽어 들일수도 있습니다. :r hello.c<CR> 라고 하면 현재 커서가 있는 줄 다음에 전에 만든 hello.c 파일의 내용이 삽입될 것입니다. 마찬가지로 주소 지정을 할 수 있습니다. :20r hello.c<CR> 는 20번째 줄 다음에 파일을 읽어들일 겁니다. 파일을 한꺼번에 여러 개 열어 놓고 파일들 사이를 오가면서 편집할 수도 있습니다. 이미 :e#명령을 배웠었지요. 이건 두 파일 사이를 오가는 명령이었습니다. :e#대신 :n#을 써도 동일한 기능을 수행합니다. 그런데 :n은 :e와는 다른 기능이 더 있습니다. 우선 셸 프롬프트 상태로 빠져 나와서 vi *.c *.tex *HOWTO Makefile 이라고 해보세요. 이제 hello.c, sample.tex, Installation-HOWTO, Makefile 의 4개 파일이 모두 읽혀질 겁니다. :n<CR> 이라는 명령을 반복해 보세요. 화면에 보여지는 파일이 계속 바뀔겁니다. 반대 순서로 바꾸려면 :N<CR> 을 입력하면 됩니다. 이제 이번 호에서 다룰 vi 기능의 백미를 소개하지요. 바로 매크로 기능입니다. vi에 매크로 기능이 있다는 것을 아는 분도 그리 많지 않지만 그걸 유용하게 쓰는 분도 별로 없을 겁니다. 그렇지만, 이건 정말 쓸 만한 기능입니다. 아까 우리가 만들었던 LaTaX 문서 있지요? 그 소스 파일(sample.tex)을 다시 열어 보세요. 이제 그 문서에 나오는 Linux라는 단어를 모두 크고 진한 이텔릭체로 바꾸어 보겠습니다. 아래아 한글이라면 메뉴에서 고르거나 단축키 Alt-L을 이용해서 글자 모양 바꾸기 창을 부르면 되겠지만, LaTeX 에서는 이런 것까지도 그냥 텍스트 파일로 해결합니다. 바꾸고자 하는 단어인 Linux를 찾아서 \textit{Linux}로 바꾸어 주면 됩니다. 물론, 앞서 배웠던 검색/대체 기능을 이용할 수도 있습니다만, 이걸 매크로 기능으로 해결해 보도록 하겠습니다. :map ^V<F1> i{\large\textbf{\textit{^V<Esc>eai}}}^V<Esc> <CR> 키보드에서 이 내용을 그대로 입력하면, 화면에는 아마 다음과 같이 보일 겁니다. :map ^OP i{\large\textbf{\textit{^[eai}}}^[ 흠, 아주 복잡해 보이는군요. 한 번 해석해 볼까요? ^OP는 첫 번째 기능키(F1)를 의미합니다. 이걸 입력하려면 조금 전 설명 드린 ^V를 쓰시면 됩니다. ^V<F1>을 입력하면 보기에는 ^OP라는 세 개의 문자가 찍힙니다만, 이건 <F1> 한 문자를 표시하기 위한 것입니다. <BackSpace>키로 지워보면 세 개의 문자가 한꺼번에 지워지는걸로 알 수 있겠네요. 그 뒤에 오는 일련의 명령은 사실 우리가 이미 다 배운 것들입니다. 입력 모드로 들어가서(i) {\large\textbf{\textit{를 입력하고 명령 모드로 돌아온 후(^[, 이것이 <Esc>를 나타낸다는 것을 이미 말씀드렸습니다), 단어의 끝으로 가서(e), 새로운 내용을 덧붙이기 위한 입력 모두로 들어간 후(a), }}}를 입력하고 다시 <Esc> 로 명령 모드로 돌아오라는 의미입니다. 다 아시는 것들이지요? 이제 이렇게 정의한 매크로를 실제 적용해 볼까요? Linux라는 단어를 찾아다니는 건 검색 명령어(/)로 간단히 해결되지요. 그 다음에는 그냥<F1>키를 눌러주면 간단히 해결됩니다. 그림 6에 그 결과가 있습니다. 여기서 든 예는 사실 검색/대체로 하는 것이 더 적절합니다. 단지 예로만 참고하세요. 그리고, 복잡한 매크로 정의라도 자주 쓰이는 것이면 .exrc 파일에 다른 set 명령들처럼 넣어 둘 수 있으니까 복잡한 건 큰 문제가 안될 겁니다. 그런데, 지금 사용중인 터미널의 상태에 따라 ^V<F1>이 제대로 동작하지 않을 수도 있습니다. 그런 경우에는 매크로를 정의할 때, ^<F1> 대신 #1의 두 문자를 입력해 보세요. 원래 같은 의미인데 경우에 따라서는 둘 중 하나만 통할 수 있으니까요. 또, <F1> 키가 Help 기능에 할당되어 있다면 대신 <F2> 키를 써도 됩니다. 이 경우에는 #2 가 되겠네요. 사실, 매크로는 어떤 문자에 할당해도 상관없습니다만, 다른 문자들이 대개 vi 명령에 할당되어있기 때문에 혼돈을 피하기 위해 기능 키를 쓰는 것뿐입니다. 자, 이제 됐나요? 이제 새로 고친 LaTeX 문서가 어떻게 바뀌었나 보고 넘어가야겠는데, 벌써 잊지는 않았겠지요? :!latex sample; xdvi sample<CR> 을 다시 한 번 실행해 보세요. ;는 명령어 종결자(command terminator) 라는 겁니다. 여러 개의 명령어를 한 줄에 쓸 수 있지요. 결과가 그림 7에 있으니 여러분의 것과 비교해 보시기 바랍니다. 이와 같이 한 번 정의한 매크로는 그 정의를 해제할 때까지 유효합니다. 해제하는 방법은 처음 정의했던 방법에 따라 :unmap ^V<F1><CR> 또는 :unmap #1<CR> 과 같이 하시면 됩니다. 현재 map으로 설정되어 있는 매크로를 보고 싶으시면 그냥 :map<CR> 이라고 인수 없이 명령하시면 됩니다. 이처럼 vi에서의 매크로도 흔히 쓰이는 매크로 기능과 동일합니다. 키 입력을 순서대로 기억했다가 그대로 수행해 주는 겁니다. 문자의 입력뿐 아니라 명령어의 입력까지도 포함해서 말이지요. 이런 매크로 기능은 다른 방법으로도 가능합니다. 이제 문서의 아무 곳에나 빈 줄을 하나 만들고 앞에서 썼던 명령어 i\textit{^]eai}^]를 그대로 입력하세요. 그리고 "aD 로 그냥 지워 버리세요. 뭐하는 짓이냐고요? 물론 X개 훈련시키는 건 절대 아닙니다. 여러분이 입력한 내용은 물론 문서에서는 사라져 버렸지만 버퍼에 고스란히 남아 있거든요. 윈도우에서 잘라내기(cut) 메뉴 항목을 선택하면 클립보드에 선택한 부분이 옮겨지는 것처럼 vi에서도 방금 지운 내용은 버퍼에 보관되게 되어있습니다. 지금처럼 특정 버퍼를 지정하고 지운 경우에는 다시 그 버퍼를 지정하고 지우거나 복사할 때까지 그 내용이 그대로 보존됩니다. 이제 설명드릴 매크로 기능은 바로 이 점을 이용하는 겁니다. 사실 방금 한 과정이 바로 매크로를 정의하는 과정입니다. 이제 첫 번째 방법에서 했던 것처럼 Linux라는 단어를 찾아가서, 이번에는 @a 의 두 문자를 차례로 눌러보세요. 아까 해보았던 매크로와 동일한 결과가 얻어질 것입니다. 보통 버퍼를 이용한 매크로를 쓸 때는 I 버퍼를 이용합니다. a,b,c 와 같은 버퍼는 이미 배운 원래 버퍼의 용도로 많이 쓰이기 때문에 매크로를 저장하기에는 적합하지 않으니까요. 만일 문서를 편집하다가 앞서 정의한 매크로의 내용이 잘 생각나지 않는다면 아무 곳이나 빈줄을 찾아 "ip 해본 후 u를 눌러서 다시 지우면 되겠지요. 위와 같은 매크로 사용법은 이미 입력된 내용을 찾아다니면서 고치는 용도라고 볼 수 있습니다. 그런데 사실, 입력을 하는 도중에도 매크로를 써야 할 때가 많습니다. 이것도 물론 가능합니다(이제 vi에서 안되는게 뭔지 궁금하지요?). 이번에는 :map! #2 \textit{<CR> 이라고 입력해 보세요. 그리고 적당한 곳에서 입력 모들 들어간 후, <F1>을 눌러 보세요. 입력 도중에 방금 정의한 내용이 삽입되는 것을 볼 수 있을 겁니다. 매크로를 정의할 때 map 명령다음에 !가 들어가고 정의 내용 중에 입력 모드로 들어가고 나오는 키가 빠져있다는 점에 주의하세요. 그럼 이것을 해제하는 방법은 무엇일까요? 맞습니다. :unmap! #2<CR> 이렇게 하면 되겠지요? 설정해 둔 매크로들을 살펴보려면 이번에는 :map!<CR> 이라고 인수 없이 명령하시면 되겠지요. 보시면 아시겠지만, :map 과 :map!은 별도로 관리되기 때문에 #1 에 두 가지를 모두 정의해도 됩니다. 실제로는 다른 매크로로 인식되니까요. 하나는 비주얼 모드에서 적용되고, 다른 하나는 입력 모드에서 적용되니까 혼돈될 리가 없지요. 마지막으로 사용구에 대해 알아볼까요? 어떤 분들은 워드프로세스에서도 써보지 못한 기능을 vi를 배우면서 쓰게 되는지도 모르겠습니다만, 이것도 역시 워드프로세서를 쓸 때 아주 요긴하게 쓰는 기능입니다. 자주 쓰는 긴말의 약어를 등록해 두었다가 쓰는 방법을 말하는 건데 약어(abbreviation) 기능이라고도 합니다. 전 세계에 3개밖에 없는 리눅스 전문지 중 하나인 우리 Linux World를 상용구로 등록해 볼까요? :ab lw Linux World<CR> 이제 등록된 겁니다. 간단하지요? 워드프로세서에서 메뉴 찾아 선택하고 다이얼로그 박스에 채워 넣는 것보다도 더 간단할 겁니다. 이제 입력 모드로 들어가서 lw가 포함된 문장을 쳐보세요. lw babo (죄송!) 바로 lw가 Linux World로 바뀔 겁니다. 약어로 등록된 것을 해제하려면, :una lw<CR> 를 쓰면 됩니다. 매크로 해제 명령과 비슷하지요? 등록된 약어를 보는 방법도 비슷합니다. :ab<CR> 라고 인수 없이 명령하면 역시 현재 등록된 내용을 보여 줍니다. 혹시 약어로 등록한 것이 온전한 단어와 혼돈되면 어떻게 하나 하고 걱정하실 필요는 없습니다. 단어 중간에 포함되어 있는 경우는 약어로 취급하지 않으니까요. 그리고 lw와 같이 흔하지 않은 문자열로 등록하면 아무 걱정이 없습니다. 게다가 약어는 입력 모드에서만 적용됩니다. 약어를 등록하자마자 문서 안에 나오는, 약어와 같은 단어가 모두 바뀌는 것이 아닙니다. 그렇게 하려면 약어 기능이 아니라 검색/대체 기능을 이용해야 합니다. 이제 대충 마무리를 해야겠네요. 이번 호까지의 내용을 보시면서 vi에 대한 인식이 바뀌었다면 좋겠습니다. 기능도 별로 신통치 않으면서 쓰기만 어려운 편집기라는 생각을 아직도 갖고 계시지는 않겠지요? 이미 말씀드린 적이 있지만, 이 모든 기능을 한꺼번에 익혀서 쓰려 하실 필요 없습니다. 어떤 기능이 있는지 알아두는 것이 무엇보다도 중요합니다. 사실 vi 에는 지금까지 다룬 것 외에도 더 많은 기능이 있습니다. 다만, 이 정도가 vi 라는 프로그램을 철저히 익혀본다는 측면에서 적절한 수준이라고 판단하는 것뿐입니다. 만일 또 다른 기능이 궁금하신 분들은 vi, ed, ex 와 관련된 다른 문서들을 참고 하시기 바랍니다. 리눅스를 유닉스 클론(clone, 복제, 쿵다리 샤바라?) 이라고 하는 경우가 있는데, 마찬가지로 vi 에도 클론이 많이 있습니다. 대표적인 것이 vim(VI Improved)입니다. 버클리 유닉스에 포함되었던 원래의 vi 의 기능을 비교적 충실하게 구현하였고 최근에는 한글을 쓸 수 있는 버전이 발표되고 있습니다. 리눅스에 기본으로 포함되어있는 vi도 vim 일 겁니다. 예전에는 elvis 라는 프로그램도 많이 쓰였고 그 밖에도 몇 가지 있지만 기본기능은 거의 같고, 나름대로 몇 가지 기능을 추가한 형태입니다. 요즈음에는 한텀, HLaTeX 같은 프로그램을 이용하면 리눅스에서도 한글 문서 작업을 얼마든지 할 수 있습니다. 아무쪼록 여러분이 리눅스에서 문서를 다루는데 조금이라도 도움이 되었으면 하는 바람을 가지면서 vi 공부를 마치도록 하겠습니다. 고수 여러분, 더 전해드릴 것이 없으니 이만 하산(下山)하시기를. |