저 자 : 이승현
|
||||||||||||||||||||||||||||||||||||||||
유닉스를 처음 접하는 사람에게 있어서 vi는 아주 골치 아픈 존재입니다. 특히 이미 DOS 등과 같은 다른 운영 체제에서 문서 편집기를 써 본 경험이 있는 사람들에게 vi 의 괴상스럽기까지 한 사용법 때문에 당황하기 마련이지요. 그렇지만 피해갈 생각은 하지 마시기 바랍니다. 물론, 유닉스 환경에서 vi 보다 우수한(또한 편리한) 문서 편집기가 있을 수는 있지만, vi를 대신할 수는 없으니까요. 어떤 유닉스 환경에서도 제공되는 기본적인 문서 편집기 중의 하나이거든요. 아무리 좋아도 쓰려고 하는 시스템에 설치되어 있지 않으면 무슨 소용이 있겠습니까? 더구나 vi 는 적어도 그와 같은 기본적인 편집기 중 가장 쓰기에 편리하고 강력한 기능을 가진 문서 편집기입니다. vi 보다 더 쓰기 불편한 문서 편집기가 있다는 사실을 믿을 수 없나요? 그렇다면 'ed' 라는 명령어의 매뉴얼 페이지를 보시기 바랍니다. 아마 몇 페이지 넘기지도 못하고 'q' 키를 눌러 버릴 겁니다. 사실 vi 는 아주 편리한 편집기입니다. 제 경험으로는 그 만큼 편리한 편집기는 써본 적이 없습니다. 글쎄요.. 만일 당신이 emacs 라는 편집기를 써본 경험이 있다면 여기에 이견이 있을지 모르겠습니다만, 혹시 MS-DOS 에서 쓰던 EDIT 나 Q-Editor 혹은 그와 유사한 편집기(제가 그러한 부류에서 손을 뗀지 오래돼서 최신 정보에는 어둡군요)만을 써보았다면 제 말을 믿고 vi 에 큰 기대를 걸어도 후회하지는 않을 겁니다. 단지 버클리의 어느 천재가 만들었다는 이유만으로 시답지 않은 편집기가 이렇게 인기를 끌리는 없으니까요. vi 의 이름이 VIsual display editor를 뜻한다는 걸 아십니까? 물론, "비쥬얼" 이 없이는 아무것도 안돼는 요즘 세상의 "비주얼" 과는 다른 의미일 겁니다. 당시는 ed와 같은 라인에디터가 일반적이었기 때문에 vi 와 같은 풀 스크린에디터의 등장은 그 자체로도 관심을 끌만 했겠지요. 라인에디터가 얼마나 불편하고 한심한지는 하이텔의 그 구석기 시대적인 편집기를 써 보신 분은 아실 겁니다. 아니면 예전에 MS-DOS 에 들어있던(지금은 어디로 갔나?) EDLIN을 기억하실지 모르겠습니다. 어쨌거나 옛날엔 모두들 그런 걸 잦고 끙끙대며 썼다는 겁니다. 라인에디터에서 스크린에디터로 사용자 인터페이스가 발전된 만큼 사용상 편리성 면에서 많은 개선이 이루어졌습니다. 더구나 유닉스처럼 텍스트에디터와 포매터가 분리된 환경에서는 텍스트에디터의 비중이 크기 때문에 기능 면에서도 많은 요구가 있게 마련입니다. 윈도우 같은 환경에서 쓰는 워드프로세서 기능의 상당부분을 텍스트에디터가 갖게 되고 vi 도 예외는 아닙니다. 그럼 본론으로 들어가서 vi 사용법에 대해 이야기해 볼까요? 우선 vi 명령을 실행시키세요. 그림1과 같은 화면이 보일 겁니다. 다소 다르더라도 신경 쓰지 마세요. 유닉스에 여러 종류가 있는 것처럼 vi 에도 여러 가지 버전이 있어서 약간씩의 차이가 있습니다. 게다가 앞으로 제가 그려서 보여드리는 vi 는 아주 작은 화면을 쓸 겁니다(크게 해서 지면을 늘이면 원고료가 많아지니 제게는 좋습니다만 ^_^). 단, 어느 경우든 '~' 문자는 아무 것도 없는 빈줄임을 나타냅니다. 처음 vi를 실행시키면 당장 무엇을 해야 할지
막막할 겁니다. 마치 한 손에 돌도끼를 든 원시인이 된 기분일지도
모르겠습니다. 이제 vi에서 가장 어려운 명령어를 먼저 가르쳐 드리지요.
자, 이제 뭔가를 써넣어야겠지요? 지금쯤 한가지 사실을 알아둘 필요가 있겠네요. vi 가 다른 '평범한' 문서 편집기와 비교할 때 가장 특이한 점은 프로그램의 사앹가 '명령모드'와 '입력모드'로 구분 되어있다는 점입니다. 보통의 편집기는 키보드에서 입력되는 문자가 그대로 문서에 포함되지요. 즉, 기본적으로 입력 모드에 있는 겁니다. 이에 반하여 vi는 기본적으로 명령 모드에 있습니다. 키보드에서 입력하는 내용은 문자 하나하나가 vi 에 대한 명령어로 인식됩니다. 이중에 입력 모드로 전환시키는 명령어가 포함되어있으면 그때 비로소 입력모드로 들어가게 되지요. 자, 우선 vi 명령을 다시 실행하세요. 이제 그림 2에 보인 바와 같이 'i' 로 시작하는 내용을 입력해보시기 바랍니다. iwhen you're weary, <CR>foolin'
small,<Esc> 입력중에 줄 바꿈을 하려면 '<Enter>'
키를 이용한다는 것까지 설명할 필요는 없겠지요. 명령 모드에서
입력하는 내용을 그림에서는 역상 문자로 나타내기로 하겠습니다.
스크린 안의 역상 문자는 물론 커서를 나타낸 것입니다.(이거 그리느라
무척 애먹었습니다). 'i' 키를 누르는 것만으로는 화면에 아무 변화도
없을 겁니다. 그 이후에 입력하는 내용이 비로소 화면에 나타나겠지요.
이제 명령모드가 뭔지, 또 입력 모드가 뭔지 감이 잡히지요? 'i'
는 '삽입하기(insert)' 명령입니다. 그 이후에 입력되는 키는 모두
문서의 내용으로 간주합니다. 즉, 입력 모드로 전환하는 겁니다.
잠깐, 동료들이 밥 먹으러 가자고 부르는군요. 그냥 두고 가도 되겠지만,
천신만고 끝에 입력한 한 줄짜리 문서를 날려 버릴 위험이 있으니
뭔가 조치를 취해야겠지요. :wwords.txt <CR> < 그림3 > 'w' 의 명령 사용법 물론 ':w'는 '파일에 쓰기(write)' 명령입니다. 뒤에 나오는 'words.txt' 는 파일 이름이니 마음대로 정하시기 바랍니다. 그런데 여기서 명심해야 할 것 한 가지가 있어요. '<Esc>' 키를 누르는 것 말입니다. 이건 입력 모드에서 명령 모드로 돌아가기 위한 겁니다. 사실 현재 상태가 입력 모드인지 명령모드인지 잘 알 수가 없는 경우가 많지요. 만일 명령 모드로 돌아가고 싶다면 아무 때나 '<Esc>' 키를 누르세요. 입력 모드에 있었다면 당연히 명령 모드로 바뀔 테고 원래 명령 모드였다면 그냥 '삑' 하는 벨 소리 한번 내고 말 겁니다. 현재 상태가 어떤 모드인지 잘 모르신다면 일단 '<Esc>' 키를 눌러 명령 모드로 간 후 다시 시작하시면 됩니다. 단, '삑' 소리를 자주 내면 옆 사람이 짜증을 낼 지도 모르겠네요. 야박한 동료들이라면 쫓겨날지도 모릅니다. 사실 분당 '삑' 소리 회수로 그 사람이 vi를 얼마나 잘 쓰는지 판단할 수 있습니다. 숙달될수록 회수가 줄어드니까요. 그때까지는 눈치를 좀 보기로 하지요. 자 이제 다른 사람을 위해서 vi를 빠져 나가는게 좋겠지요. 방법을 잊어 버리시지는 않았는지요?(식사는 잘 하셨는지...) 이제 하던 일을 계속 해볼까요. vi를 다시 실행하기는
해야 하는데, 아까하고는 상황이 좀 다르군요. 이미 만들어져 있는
파일을 열어서 작업을 계속해야 하니까요. 이번에는
when you're weary, a<CR>tears are in your eyes, <Esc> when you're weary, < 그림 4 > 'a' 의 명령 사용법 'a'를 누르면 현재 커서 위치의 문자는 그대로
두고 그 뒤로 커서가 옮겨가지요? 이건 '덧붙이기(append)' 명령을
의미합니다. 이때부터는 입력 모드입니다. 여기까지 입력하고 일단
명령 모드로 돌아오시기 바랍니다.(어떻게?) 이제 겨우 3줄이 되었군요.
지금부터는 자주 저장하는 습관을 들여야 합니다. 그냥
이쯤 해서 커서를 옮기는 방법에 대해 좀 더 살펴볼까요. 물론 편집하던 문서는 다시 열어 두셨겠지요? 앞서 이미 화살표 키를 이용하면 된다고 했지만, vi 답게 뭔가 별난 방법이 있을 것 같지 않나요? 사실 vi는 일반적으로 쓰는 환경보다 더 열악한 환경에서도 잘 동작하도록 되어있습니다. 화살표 키가 안 듣는 경우에도 vi를 거뜬히 쓸 수 있습니다. 사실 좀 습관이 되면 화살표 키 따위는 쓰지 않게 될 겁니다. 'h', 'j', 'k', 'l' 키를 몇 번씩 번갈아 눌러 보세요. 어떤 키가 어떤 방향인지 외우려고 하지 말고 감으로 익히시기 바랍니다. 저도 위 방향으로 가려면 어떤 키를 눌러야 되느냐고 묻는다면 대답하지 못합니다. 사실은 어떤 키들이 쓰이는지 조차도 외우지는 못합니다만, 화살표 키는 전혀 쓰지 않습니다. vi를 제대로 익히면 모든 명령을 문자-숫자 판만으로 해결할 수 있습니다. 이번에는 번거롭게 커서를 줄의 맨 끝으로 이동해서 새로운 내용을 추가하는 것 보다 좀더 세련된 방법을 알아보겠습니다. 덧붙이기는 덧붙이기인데 현재 커서 위치 대신 현재 커서가 있는 줄의 끝에 덧붙이는 겁니다. 'j' 키를 이용해서 마지막 줄로 이동한 후(줄의 끝 문자까지 갈 필요는 없습니다.) 그림 5와 같이 입력해 보세요. when you're weary, when you're weary, < 그림 5 > 'A'의 명령 사용법 'a' 명령과 'A' 명령이 어떤 차이가 있는지 아시겠지요? 이번엔 마지막 줄에 커서를 두고 그림 6과 같이 입력해 보세요. when you're weary, when you're weary, < 그림 6 > 'o'의 명령 사용법 이번엔 '<Enter>' 키를 누르지 않았지요. 결과는 같지만. 이 명령은 '새로운 줄 열기(open)'를 의미합니다. 그런데 이 명령에도 대문자 형태의 명령이 있습니다. 일단 명령 모드로 돌아온 후, 이번에는 그림 7을 따라 입력해보세요. 이제 vi 화면에 어느 정도 익숙해지셨을테니 지면 관계상 그림은 가능하면 생략하겠습니다.(사실은 힘들어서 더 못 그리겠습니다.) when you're weary, when you're weary, < 그림 6 > 'O'의 명령 사용법 아까는 현재 커서가 있는 줄의 밑에 새로운 줄을 열었던 반면 이번에는 현재 커서가 있는 줄을 아래로 밀어내고 그 자리에 새로운 줄을 열었지요. 아마 대문자라 힘이 좀더 센가 봅니다. 이제 입력 모드로 가기 위한 명령들을 대충 배운 것 같군요. 한번 정리해 볼까요? 'a', 'i', 'o', 그리고 각각의 대문자 명령어인 'A', 'I', 'O' 가 있지요. 참, 그런데 'I' 에 대해서는 설명이 빠진 것 같군요. 'a'와 'A' 사이의 관계로부터 유추해 보시지요. 아니면 지금 직접 해보세요. 'I'와 'O'의 차이가 무엇일까요? 현재 커서가 있는 줄의 내용을 밀어내고 새로운 내용을 입력받는다는 점은 같은데, 끝에 줄 바꿈이 포함되느냐 안되느냐의 차이가 있지요. 마찬가지로 'A' 와 'o'의 차이점도 생각해보시기 바랍니다. 자, 이제 제법 문서의 분량이 늘어났군요. 지금부터는
문서를 열어서 'j' 키로 문서의 끝까지 이동하는 것이 귀찮아지기
시작할 겁니다. 혹시 수백 페이지 짜리 문서를 편집할 경우를 상상한다면
아찔할 지도 모르겠군요. 뭔가 한번에 옮겨가는 방법이 있을 법하지요?
vi 의 특징 중 하나는 "왠지 있을 것 같은 기능은 어김없이
있다" 는 겁니다.
이제 문서 전체의 어떤 위치로도 커서를 손쉽게 옮길 수 있게 되었군요. 단지 'h', 'j', 'k', 'I', 'G' 와 숫자 키만으로 말이지요. 그러나 아직 끝나지 않았습니다. vi 의 커서
이동 명령은 매우 정교합니다. 커서 이동 명령을 얼마나 능숙히
쓰느냐가 작업 능률에 큰 영향을 줍니다. 곧 다루겠지만, 커서 이동
명령이 다른 명령과 함께 쓰여서 여러 가지 다양한 기능을 수행할
수도 있습니다. 지금 아무 위치에서나
이번엔 진짜 좀더 큰물에서 놀아봐야겠습니다.
우선, 좀 덩치 큰 문서를 찾아서 열어 볼까요. 아무거나 상관없지만,
우리가 쓰는 것이 리눅스이니 HOWTO 문서를 하나 골라 보도록 하겠습니다.
흔히 쓰는 레드햇 배포본의 경우, '/usr/doc/HOWTO' 디렉토리에
HOWTO 문서들이 모여 있습니다. 다른 배포본을 쓰시는 분들도 어딘가에
있을 테니 찾아보세요(이 분서들이 어디있는지 모른다는 건 리눅스
쓰는 사람으로서 문제가 있는 겁니다.). 그 중에서 가장 기본이
되는 Installation-HOWTO를 보겠습니다. 일단 다음과 같이 홈 디렉토리로
복사를 하지요.
혹시 리눅스를 쓰고 있으면서 아직 이 문서를
읽어보지 않은 분들은 이번 기회에 잘 읽어보시기 바랍니다. 이건
리눅서라면 기본적으로 알아야 할 유용한 정보를 많이 담고 있으니까요.
이제
파일의 첫 줄과 끝 줄 사이를 오가는 명령은
아시지요? 그런데 이렇게 큰 문서를 극에서 극으로만 움직이니 재미가
없을 겁니다.
vi 에서 화면이란, 터미널이 사용자에게 보여주는
특정 부분을 말합니다. 우리가 처음에 편집하던 짧은 문서는 한
화면에다 보일 수 있지만, 지금 얼어 놓은 파일처럼 큰 파일은 일부분만을
보여 주지요. 만일 현재 화면에 보이지 않는 부분을 보거나 편집하려면
화면을 그 부분으로 옮겨가야만 합니다. 앞서 보았던 'G' 명령도
일종의 화면 이동 명령이라 할 수 있습니다. 여기서 설명 드릴 4가지
명령은 모두 '<Ctrl>'키와 함께 쓰인다는 것을 우선 알아두시기
바랍니다. 앞과 뒤 방향을 의미하는 forward 와 backward, 그리고
위와 아래를 의미하는 up 과 down, 이 네 가지 간단한 단어만 기억하시면
됩니다. 직접 한번 해보세요.
다시 처음 우리가 편집했던 역작 'words.txt'를
가지고 놀아 봅시다(물론, 위의 Installation-HOWTO 는 반드시 읽어
보셔야 합니다.). 우리가 알고 있는 입력모드 명령은 'a', 'i',
'o' 정도였습니다. 그런데, 편집하다 잘못 입력했을 때는 어떻게
하지요? 그건 간단합니다. 편집하던 파일을 버리고 새로 만들면
되지요. 좋은 방법이긴 한데(?) 그렇다면 아무도 vi를 쓰지 않을
겁니다. 이번엔 왠지 마음에 안 드는 단어 위로 커서를 옮기고
그러나 한참을 편집하다가 갑자기 마음이 바뀌었을
경우는 어떨까요? 물론 이제까지 쳐 넣은게 아깝기는 하겠지만,
미련 없이 버리겠다면? 그렇죠, 그냥 빠져 나오면 되지 않겠어요?
거 쉽다.
라고 명령해 보세요. 뭔가 없어지긴 했는데 어느 놈인지 잘 분간이 안된다고요? 이번에는 커서가 위치한 곳의 바로 앞 문자가 지워진 겁니다. 그러면서 커서와 커서가 있던 문자 이후의 내용이 한 칸 씩 당겨진 것입니다. 이제 쓰고 지우는 방법을 익혔으니 사실상 문서의
수정이 가능하게 되었네요. 하지만 지우고 쓰는 걸 한번에 하는
명령은 없을까요. 고치기 명령 말입니다. 있을 법한 명령은 있게
마련이라는 말 기억나시죠? 이제 고치기(change) 명령 'c' 에 대해
알아보기로 하지요. 이 명령은 적용 범위를 나타내는 문자와 함께
쓰입니다.
이쯤에서 퀴즈하나 내볼까요? 한 줄로 이루어진
내용을 두 줄로 분리하려면 어떻게 하나요? 이건 너무 쉽지요. 적당한
위치의 공백 문자로 가서 'r'을 누른 후 '<Enter>'를 치면
되니까요. 만일 공백문자가 아닌 곳에서 나누려면 그냥 'i'를 누른
후 '<Enter>'를 치고 '<Esc>' 키로 명령 모드로 돌아오면
될테고요. 그럼 반대는 어떨까요? 두 줄로 되어있는 내용을 한 줄로
만들려면? 이것도 이미 배운걸로 됩니다. 히히히, 뻥입니다요. 고민
많이 하셨어요? 사실은 두 줄을 하나로 잇는(join) 명령은 따로
있습니다.
이번에는 'x'를 때려 대며 하나하나 지우는 게
감질나서 못해먹겠다는 통큰 분을 위해 좀 과격한 방법을 소개하겠습니다.
사실 엄마 몰래 오락실에서 정신없이 눌러대던 초등학교 시절(지금도
그러신다고요?)의 추억에 잠기는 것도 괜찮을 것 같지만, 아무래도,
그런 기분은 안 나지요. 자, 이제 다시 한면 가엾은 사형수를 고르세요.
다섯 번째 줄이 좋을까요? 아니면 여섯 번째?
이게 뭘까요. 바로 복사하기(yank) 기능입니다.
이 명령을 내리면
이제 이러한 것들을 좀 응용해 보도록 하지요. 만일 3,4,5번째 줄을 6번째 다음으로 옮기려면 어떻게 해야 할까요? 우선 3번째 줄에서 'dd' 한 후(한 줄 지웠으니까) 5번째 줄로 가서 'p'를 누르고, 다시(원래는 4번째 줄이었던) 3번째 줄로 가서 'dd' 한 후 5번째 줄로 가서 'p'를 누르고, 다시(원래는 5번째 줄이었던) 3번째 줄로 가서 'dd' 한 후 5번째 줄로 가서 'p'를 누르면 됩니다. 됐나요? 그런데 좀 복잡하네요. 더 간단히 할 수 있을 것도 같은데. vi 의 아주 유용한 기능 중 하나가 어떤 명령어는 앞에 번호를 붙임으로써 수행회수를 지정할 수 있다는 겁니다. 이를 이용해서 아까 했던 과정을 다시 해 볼까요? 우선 3번째 줄에서 '3dd'를 합니다. '3dd'는 하나의 명령입니다. 'dd'를 3번 수행하는 것이 아닙니다. 따라서 이렇게 하면 3줄의 내용이 한꺼번에 버퍼에 들어가게 됩니다. 이제 바로 'p'를 누르면 아까와 같은 결과를 얻게 되지요. 훨씬 간단하지요? 이처럼 수행회수를 지정하는 다른 예를 들어볼까요? '2yy'는 커서가 있는 줄을 포함해서 두 줄의 내용을 버퍼에 복사하라는 명령입니다. '5x'는 커서가 있는 문자부터 5개의 문자를 지우라는 명령이지요. 그럼 '3s'는 무엇일까요? 커서가 있는 위치의 문자부터 3개의 문자를 지운 후 입력모드로 전환합니다. '<Esc>' 키에 의해 명령 모드로 돌아올 때까지 입력된 내용이 원래 있던 3개의 문자를 대치하게 됩니다. '7r'은 7개의 문자 각각을 모두 다음에 입력하는 하나의 문자로 바꿉니다. 예를 들어 '7r0'라고 입력하면 현재 커서가 있는 위치부터 7개의 문자를 7개의 '0' 즉, '0000000'으로 바꿉니다. 이런 방법은 내용을 입력하거나 고칠 때만 적용되는 것이 아닙니다. '5j' 나 '7k'가 어떻게 적용되는지 직접 해보세요. 그 밖의 커서 이동 명령에도 적용해서 연습해 보시기 바랍니다. 한참을 떠들어대니 힘드는군요. 이제 한가지만 더 말씀드리고 끝내야겠습니다. 버퍼가 하나 뿐이라 불편하지 않습니까? 문서를 죽 훑어 보면서 두 가지 문자열을 적절한 곳에 삽입하는 작업을 해야 한다고 가정합시다. 두 개의 버퍼에 두 개의 문자열을 하나씩 넣어 두고 필요한 곳마다 'p'명령을 쓰면 참 간단할 것 같지요. 사실 vi 에는 앞서 사용한 버퍼 외에 26개의 별도의 버퍼가 제공됩니다. 각 버퍼에는 이름이 주어져 있고 각 버퍼의 내용들은 서로 영향을 주지 않습니다. 이름은 영어 알파벳 a부터 z 까지 입니다. 그래서 26개입니다.(맞나요?) 사용방법은 간단합니다. 그냥 'y' 나 'd' 명령을 쓰기 직전에 '"a' 와 같이 버퍼 이름을 지정하면 됩니다. 두 번째 버퍼를 쓰려면 '"b' 라고 하면 됩니다. 각 버퍼에 있는 내용을 붙여 넣을 때도 같은 방법으로 버퍼를 지정하면 됩니다. 예를 들어 '"a2yy' 라고 하면 현재 커서가 있는 줄을 포함해서 2줄을 버퍼 a 에 넣어 두고, 이어서 '"by$' 라고 하면 현재 커서가 있는 위치부터 줄의 끝까지의 내용을 버퍼 b 에 넣어 둡니다. '"' 문자를 버퍼 이름과 함께 써서 특정 버퍼를 지정한다는 겁니다. 아시겠지요? 이제 적당한 위치에서 '"ap' 라고 하면 버퍼 a 에 저장된 2줄의 내용을 현재 커서가 있는 줄 다음에 붙여 넣고 다시 적당한 위치에서 '"bP' 라고 하면 버퍼 b 에 저장된 내용을 현재 커서가 있는 문자의 뒤에 붙여 넣게 됩니다. 이 버퍼의 사용은 여러 문서를 동시에 편집할 때에도 요긴하게 쓰이니 반드시 기억하시기 바랍니다. 모든 게 그렇지만 말로 듣고 이해하는 것만으로는 부족합니다. 자, 그럼 다음 그림을 보고 따라해 보세요. when you're weary, "ayw~0jj"aPj$4h"byejjbb"aPje"bp when you're weary, < 그림 8 > 지정된 버퍼 사용법 마치 무슨 암호를 나열해 놓은 것 같지요. 무슨 뜻인지도 모르고 보고 베낀다면 무척 헛갈리겠지만 그 의미를 알고 쓴다면 역시 별거 아닙니다. 사실, 처음 나온 명령어도 하나 있으니 유의해서 보세요(뭘까요?). 우선 한번 보고 더듬더듬 따라한 후, 다음에는 각 명령어의 의미를 따져가면서 직접 해 보세요. '감'으로 하라는 말 기억나세요?(제다이의 기사처럼, 눈을 감고 'force'를 쓰세요.) 다음 기회에는 여러 문서를 동시에 열어놓고 편집하는 방법을 비롯한 파일 다루기와 문자열 검색 및 대체, vi 에서 ex 명령어 사용하기와 같은 더 복잡한 내용을 다루기로 하겠습니다. 참, 숙제 한가지. '.' 가 명령 모드에서 쓰이면 무슨 역할을 하는지 알아보세요. "문장의 끝을 나타내는 마침표입니다." 이런 대답하는 분 없기를 바랍니다. ^_^ |