[연재] VI 를 잘 써보자.
– 서민구
내가 배운 모든 것은 개발자 커뮤니티로 부터 왔고 따라서 나는 내가 배운 것을 다시 그들에게 돌려주고자 합니다. 이 연재가 VI로 고통스러워 하는 사람들에게 도움이 되기를 바랍니다. 이 글에서는 어느 책에서나 찾아볼 수 있는 간단한 편집에 대해서는 이야기하지 않을 것이며, 제가 사용하는 VI의 특별한 기능들을 중심으로 다루겠습니다.
이 글의 저작권에 대하여 : 향후 마음이 내키면 잡지에 기고할지도 모르므로 이 글의 전부 또는 일부를 복제하여 인터넷상에 올리거나 출력후 복사하여 다른 사람들에게 나누어 줄 수 없습니다. 또한 상업적인 목적으로 사용할 수 없습니다. 다만 비 영리를 목적으로한 세미나, 학교(사설 학원 제외)에서는 출력후 인쇄물을 복사하는 방식으로 사용할 수 있습니다. 또한 개인 소장 목적으로 하드디스크나 디스켓, CD-ROM, USB 디스크등의 저장장치에 저장하실 수 있으나, 개인 홈페이지에 업로드 하실 수는 없습니다. 웹에 올리고자 하시는 경우에는 이 글에대한 직접적인 하이퍼 링크를 사용하실 수 있으며, 제 홈페이지 자체에 대한(즉, http://mkseo.pe.kr) 링크를 사용하실 필요는 없습니다. |
이하 이런 글이 다 그렇듯 반말모드.
1. 환경설정
1.1. 프로그램 설치
VI는 VIM과 VI 두종류가 있는데, 그중 VIM 이 개선된 버전이다. which vim을 통해서 vim을 찾볼 수 있다.
[pool007@w-066 pool007]$ which vim /home/bin/vim |
그리고 vi를 찾아본다.
[pool007@w-066 pool007]$ which vi /home/bin/vi [pool007@w-066 pool007]$ file /home/bin/vi /home/bin/vi: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped |
이처럼 바로 vi가 하나의 바이너리일 때도 있고 vi가 vim에 대한 심볼릭 링크일때도 있다. vi가 vim에 대한 심볼릭 링크일때는 별 문제가 없으나 vim 자체가 없다면 vim부터 구해서 설치 한다. 설치에 필요한 rpm은 http://rpmfind.net을 사용하면 편하다. 혹은 http://tuxfinder.com/ 를 사용하도록 하라. 이 두곳에 rpm이 없다면 더이상 찾아헤메지 말고 소스를 바로 컴파일 하기 바란다.
소스 컴파일은 소스를 http://www.vim.org 에서 다운받아서 설치하면 된다. 대부분의 리눅스 프로그램은 압축을 풀고
./configure make make install |
를 하면 컴파일과 설치가 되지만, 항상 README와 INSTALL을 훑어보아 특별한 설정이 필요한지 유의해야한다. 예를들어 텍스트 웹 브라우저인 lynx를 예로 들 수 있다. 이 프로그램은 보안상 주의가 필요하며, 따라서 문서를 잘 읽고 설치해야만 한다.
1.2. 환경 설정
vi의 환경설정 파일은 자기 홈 디렉토리에서 설정하면 된다. 시스템에 전역적으로 영향을 주고 싶다면 여러가지 방법이 있겠으나, 그런 방법은 스스로 연구해보도록 하자.
설정파일은 ~/.vimrc 이다. 다음과 같이 입력하도록 하라.
set ts=4 set expandtab set ai set shiftwidth=4 map |
여기서 중요한 점이 있다. ^는 단순히 꺽쇠를 입력한게 아니다. 이는 하나의 특수문자인데 다음과 같이 입력해야만 한다. 먼저 CTRL+V를 누른다. 그리고 CTRL를 누른채로 원하는 문자를 눌러야한다. 예를들어 ^M은 CTRL+V, CTRL+M에 해당한다.
위에 보이는 문자 중 ^M은 엔터키에 해당한다.
2. 설정을 사용하는 방법
2.1. set ts=4
이는 탭이 화면에 몇칸으로 나타나는 가를 설정하는데 사용된다.
만약 ts=8로 하면 어떻게 될까. 설정파일을 손대지 않고 이 값을 변경하려면 편집화면에서 빠져나오기 위해 <ESC>를 눌른뒤 :set ts=4 를 입력하고 엔터를 친다. 그러면 다음과 같이 화면에 입력했던 탭들은 8칸으로 나타나게 된다. vi의 기본설정은 ts=8이며 따라서 보기에 그리 좋지 않다.
(주의 : 만약 앞서의 설정 파일 입력을 끝냈다면 ts=8로 바꾸더라도 화면에 변화가 없을 것이다. 이는 뒤의 set expandtab에서 다룬다.)
2.2. set expandtab
이 설정은 tab을 스페이스로 바꾸는 설정이다. 나는 반드시 이 설정을 사용할 것을 적극적으로 권한다. 아니 명령한다. 이는 코드를 깨끗하게 보기위한 필수적인 조건이다. 예를들어 다음 화면을 보자.
그리고 이를 콘솔에서 cat나 less로 보자.
이처럼 편집과 보기에 아무런 문제가 없다. 그러나 탭을 공백으로 바꾸지 않게 되면 다음과 같은 형태로 나타나게된다.
“int **dist” 라는 문장앞에 tab이 입력되었기 때문에 이처럼 엉망으로 나타난 것이다. 콘솔에서는 탭이 8칸이며, 다른 행들은 모두 스페이스로 인덴트가 되어있는 상태이므로 이와같은 칸의 불일치 현상이 나타난다. 이 뿐만 아니라 어떤 사람들은 탭을 3칸으로 사용하므로, 탭을 쓰면서 탭을 공백으로 바꾸어주지 않는다면 심지어 동료 개발자의 vi내에서도 당신의 코드가 엉망으로 보이게된다.
따라서 다시한번 요청한다. 반드시 set expandtab을 사용하라.
2.3. set ai
이 설정은 자동 인덴트를 의미한다. 예를들어
main() { … if ( a== 3 ) { |
까지 입력하고 엔터를 쳤을때 set ai상태에서는 커서가 if의 i밑으로 위치하지만 ai가 아니라면 다음 줄의 제일 처음으로 커서가 옮겨간다.
2.4. set shiftwidth=4
이 명령은 쉬프트 크기를 조정하는데 사용된다. 이 기능을 알아보기 위해 <ESC>를 누른뒤 V를 눌러보자. 그러면 VI가 VISUAL MODE로 변경되며 이 때는 커서키를 사용해 블록을 지정할 수 있다.
이 상태에서 d를 누르면 삭제, y를 누르면 복사가 이루어진다.
여기서는 선택한 블록을 인덴트하기 위해 > 를 입력해보자.
그림과 같이 인덴트가 된다. 여기서 shiftwidth=4 를 설명하자면, ‘인덴트가 되는 크기의 지정’을 의미한다. 즉, >를 눌렀을 때 4칸이 인덴트 된다는 의미이다. vi의 기본값은 shiftwidth=8이며 따라서 > 를 눌렀을 때 8칸이 인덴트 된다. 또, 당연하게도 인덴트 된 블록을 앞으로 끌어당길때에는 < 를 입력하면 된다.
2.5. map
“map <펑션키> 명령”은 펑션키와 명령을 대응시키는 기능을 한다. 따라서 이 설정은 ‘F2를 누르면 :w 를 입력하고 엔터를 치라는 의미이다. 즉, 파일 저장을 의미한다.
파일을 수정한뒤 F2를 눌러서 파일을 저장해보자. 굉장히 편할 것이다. 이것은 타자가 빠르고 느리고의 문제가 아니다. 필자는 VI가 마우스를 전혀 사용할 필요가 없고, 또한 손가락이 별로 움직이지 않는다는 주장에 동의하지 않는다. 필자가 알기로는 단 한번도 VI의 키 사용과 다른 에디터의 키 사용간에 대한 노동강도를 비교한 실험은 없었으며, 따라서 사람들의 주장은 단순한 리눅스 맹신자들의 이야기에 불과하다.
실험 없이 명확하게 주장할 수 있는 것은 ‘키 입력 갯수와 노동 강도는 비례한다’는 것이다. ESC는 일반 키와 달리 매우 먼 거리에 위치하고 있으며 shift를 입력하기 위해서는 새끼손가락이 희생해야한다. 사실 어떤 손가락을 사용하던지 간에 shift의 사용은 괴로운일이다.
2.6. map
F3키를 :20vs ./ 에 대응시킨다. :20vs 는 화면을 수직분할하되 좌측 20%를 새로운 창으로 하라는 의미이다. 뒤의 ./ 는 현재 디렉토리를 의미한다. 따라서 F3을 누르면 좌측 화면에 현재 디렉토리를 보여주게된다.
만약 잘못된 명령이라는 말이 나온다면, vim의 버전이 낮은 것이다. 조속히 업데이트하는게 낫다.
위 그림과 같이 디렉토리의 목록이 나온상태에서는 커서키를 사용하여 파일들을 브라우징 할 수 있다. ../ 에 커서를 위치하고 엔터를 치면 상위 디렉토리로 가는 것도 가능하다. 이렇게 파일 목록을 볼 수가 있다.
2.7. map
보기만 하면 뭐하겠는가. ‘:20vs ./’의 진정한 장점은 파일을 직접 불러들일 수 있다는데 있다. 파일 목록에서 편집을 원하는 파일위에 커서를 위치하고 F4를 누른다.
그림과 같이 파일을 로드할 수 있다.
[계속…]