VIM 강좌 - VIM 시작하기 [출처] VIM 강좌

|

1. vim 소개

vim 은 유닉스에서 널리 사용되고 있는 텍스트 에디터인 vi의 한 종류로써 전통적인 vi 에디터에 비해 많은 기능이 추가된 강력한 에디터이다. vim은 그 기능에 비해 상대적으로 가벼워 사이즈가 큰 파일을 편집할 때도 높은 편집 속도를 낼 수가 있다. 오늘날 Window 환경에서 WYSIWYG을 지원하는 많은 에디터들이 있지만 vi처럼 달되?숙달 될수록 작은 손놀림으로도 높은 편집 속도를 낼 수 있는 에디터는 없?것이다. vim은 기능이 다양할 뿐만 아니라 다양한 운영체제를 지원한다. 모든 리눅스/유닉tm 뿐만 아니라 과거 16bit 도스에서부터 Windows-XP에 이르는 MS 환경까지 거의 모든 플랫폼에서 vim을 사용할 수 있다. 또한 vim은 국제화가 무척 잘 되어 있는 에디터이다. vim 이 설치되어 있는 환경이 한글 Windows 2000, 한글화된 리눅스 혹은 유닉스라면 모든 메시지가 한글로 출력될 뿐만 아니라 한글 입력 또한 문제가 없을 것이다. 물론 영문 Windows 및 영문 환경의 리눅스 혹은 유닉스라면 메시지가 영문으로 출력될 것이다. 앞으로도 vim을 통해 출력되는 메시지를 설명할 때 영문 혹은 한글 두가지를 모두 설명할 것이다. 흔히들 vi를 개발자를 위한 에디터로 알고 있지만 vi는 개발자뿐만 아니라 어떠한 텍스트 편집에도 강력한 기능을 발휘하는 범용 텍스트 에디터이다. 리눅스나 유닉스를 처음 접하는 사용자에게는 vi 와 같은 에디터가 처음으로 다가오는 큰 벽이 아닐 수 없다. 컴퓨터를 처음 접하고 나서 맨 처음 배운 에디터가 vi 가 아니고서야 편리하고 화려한 에디터와 워드 프로세서만을 접해온 사용자에게는 분명 배우고 어렵고 힘들 수밖에 없을 것이다. 하지만 고진감래라 했던가? 힘들게 배운 만큼 충분히 보상은 따를 것이다. 이 연재를 충실히 따라하고 손에 익을 때까지 연습하다보면 어느새 현란한 손놀림으로 순식간에 텍스트를 편집하는 멋진 실력가가 되어 있을 것이다.


2. vi 준비 운동

이번 호에서는 본격적으로 vim 의 세계에 들어가기 전에 기본적인 vi 명령에 익숙해지는 시간을 가져 보기로 하겠다. vi를 처음 접하는 사용자에게 가장 어려운 개념은 바로 여러 가지 “Mode”가 있다는 것이다. vi 에는 맨 처음 파일을 오픈 하거나 특별한 명령을 대기하는 "Normal Mode", 내용을 입력할 수 있는 "Insert Mode", 명령을 내릴 수 있는 "Command Mode", 그리고 Vim에는 특별히 "Visual Mode"라는 것이 있다. 현재 자기가 어떤 모드에 있는 지는 좌측 하단을 보면 어림잡아 알 수 있다.

여러분의 터미널에서 위와 같이 “vim 파일이름” 명령을 입력했을 때 뜨는 화면은 “Normal Mode” 이다. 아래 그림에서 알 수 있듯이 "Normal Mode" 에서는 좌측하단에 특정 Mode를 가르키는 메시지 없이 비어 있을 것이다.

위처럼 ‘ ~ ‘ 로 시작하는 줄은 파일에 내용이 없음을 나타낸다. 위의 그림은 파일에 아무 내용이 없다고 생각하면 된다.

자 이제 내용을 입력해 보기로 하자. 위의 입력 모드에서 "i" 를 누르면 다음 그림처럼 "Insert Mode"로 변경 될 것이다. "Insert Mode"로 들어가게 되면 좌측 하단에 “-- 끼워넣기 --” 혹은 "-- INSERT --" 라는 메시지가 출력될 것이다. 메시지는 국제화에 따라 한글 환경 혹은 영문 환경에 따라 다르게 출력될 뿐 기능에는 전혀 영향을 주지 않는다. “Insert Mode"에서는 키를 누르기 전까지 입력하고 싶은 내용을 원하는 만큼 입력할 수 있다. 입력이 끝나면 키를 눌러 다시 "Normal Mode"로 돌아 갈 수 있다.

앞으로 자주 사용할 Mode를 몇가지 들어보면 Normal, Insert, Visual, Command Mode를 들 수 있다. Normal Mode에서 다른 Mode 로 전환 할 수 있으며 다른 모드에서 Normal Mode 로 가기 위해서는 무조건 를 누르면 된다. Visual Mode 와 Command Mode 는 활용하게 될 때 설명하도록 하겠다.

※ 가장 흔한 실수

vi에 익숙하지 않은 사용자는 간혹 자기가 어느 Mode에 있는 지 몰라 문서 편집을 망치는 경우가 있다. 물론 좌측 하단에서 현재 어느 Mode 인지 알려주긴 하지만 이 영역이 단순히 Mode 뿐만 아니라 다양한 메시지도 출력하기 때문에 자신이 어느 Mode 에 있는지 정확히 알지 못할 수 있다. 이때 가장 좋은 방법은 를 눌러 "Normal Mode" 로 빠져 나가는 것이다. 키는 여러 번 눌러도 "Normal Mode"로 유지하기 때문에 뭔가 이상하다 싶을 때 무조건 이 키만 눌러주면 실수를 줄일 수 있을 것이다.


3. 기본적인 편집 명령

3.1 한 문자 씩 이동 (h k j l)
vi에서 이동은 "Normal Mode"에서 행해진다. vi 는 기본적으로 방향키 대신 일반적인 문자키를 사용한다. 그럼 먼저 문자 하나하나 사이를 이동하는 것부터 알아보도록 하자. vi 는 h(좌), j(하), k(상), l(우) 4개의 키를 사용하여 이동을 한다. 물론 "Insert Mode"나 "Normal Mode"에서 방향키를 이용하여 이동할 수도 있지만 "Normal Mode“에서 h, j, k, l 이 4개의 키를 이용하는 것이 훨씬 이동속도를 빠르게 해준다. 한가지 vi는 대문자와 소문자를 구분하기 때문에 Caps Lock 이 눌려있는 상태에서 대문자를 입력하지 않도록 유의해야 한다. 만약 대문자를 입력하게 되면 전혀 다른 동작을 하게 된다. 이동키는 손에 어느 정도 익을 때까지 충분히 연습해 보기 바란다.

3.2 삭제 ( x )
문자 하나를 삭제하기 위해서는 삭제하고자 하는 문자로 이동한 후 ‘x' 키를 누르면 된다. 물론 삭제 역시 "Normal Mode"에서 이루어진다. 만약 5개의 문자를 지우고 싶다면 xxxxx 이렇게 다섯 번 연달아 누르면 된다.

3.3 Undo 와 Redo ( u, Ctrl+u )
편집을 하다 보면 어떤 문자나 문장을 삭제하였거나, 입력한 문장이 마음에 들지 않을 때 차라리 이전 내용으로 돌아가고 싶을 것이다. 이 때 사용할 수 있는 기능이 “Undo” 이고 “Normal Mode"에서 'u'를 입력하면 된다. 만약 "Insert Mode"에서 내용을 입력하다 입력한 내용을 취소하고 싶다면 'u'를 입력하면 된다. vim 에서는 파일을 저장하기 직전까지 언제든지 돌아갈 수 있기 때문에 내용이 마음에 들지 않으면 'uuuuuu' 와 같이 여러 번 Undo를 실행 할 수 있다. Undo를 실행하다 보니 순간 처음 내용이 오히려 나아 보일 때가 있을 것이다. 이때 사용할 수 있는 기능이 Redo 이다. Redo 는 "Ctrl+u" 로 Ctrl 키와 u 를 동시에 누르면 된다.

3.4 입력 (a)
‘i'를 통해 "Normal Mode"에서 “Insert Mode"로 들어가게 되면 현재 커서 위치에 바로 입력 할 수 있게 된다. 그렇다면 키를 누른 후 한 줄의 끝으로 이동한 후 줄의 끝에 단어를 추가해 보도록 하자. 아마도 줄의 끝으로 이동한 후 ’i'를 눌러 문자를 입력하게 되면 아래 그림처럼 줄의 끝이 아니라 끝에 있는 문자 앞에 추가가 될 것이다. 이러한 경우 현재 커서 다음 위치에 내용을 추가하고 싶을 때 사용할 수 있는 키가 바로 ‘a'이다. ‘a'를 누르게 되면 'i'처럼 좌측 하단에 “Insert Mode" 임을 알리는 메시지가 보이게 될 것이다. 줄의 끝이나 단어의 끝으로 이동 한 후 'a-_-;;' 와 같이 원하는 내용을 추가해 보도록 하자. You'll take away the biggest part of me‘a-_-;;' 입력 You'll take away the biggest part of me-_-;;

3.5 줄 삭제, 추가 (dd, o, O)
이제 기본적인 줄 단위 조작에 대해 알아보도록 하자. 편집 중인 문서에서 한 줄을 삭제하고자 하면 ‘dd', 즉 연달아 ’d'를 두 번 입력하면 된다. 물론 삭제한 이후 바로 되돌리고 싶다면 ‘u'를 누르면 될 것이다. 빈 줄을 추가하기 위해 지금까지 배운 방법을 활용한다면 먼저 줄의 맨 끝으로 이동하여 "Insert Mode"로 들어간 다음에 를 입력하면 될 것이다. 하지만 vi 에서는 이보다 훨씬 간단한 방법을 제공하고 있다. 만약 현재의 커서의 다음 줄에 빈 줄을 추가하고 싶으면 'o', 커서 전 줄에 빈 줄을 추가하고 싶으면 'O'를 눌러주면 된다.

3.6 반복
실행 커서를 오른쪽으로 5칸 옮기고 싶을 때, 10개의 문자를 삭제하고 싶을 때, 3줄을 없애고 싶을 때, 같은 명령을 원하는 횟수만큼 반복하여 원하는 결과를 얻을 수 있을 것이다. 하지만 어느 누가 단순하게 반복되는 조작을 좋아 할 수 있을까? vi 에디터는 원하는 명령 앞에 반복하고 싶은 횟수를 지정하여 원하는 만큼 명령을 반복 실행 할 수 있다. 예를 들어 ‘3l' 은 오른쪽으로 3칸 이동, '4dd' 는 4줄 삭제를 나타낸다. 삭제 및 이동 명령은 단순히 명령어 앞에 반복하고 싶은 횟수만 지정하면 되지만 'i', 'a', 'o', 'O' 와 같이 삽입, 추가 명령과 함께 사용할 경우 반드시 키를 눌러주어야 한다. “Love”라는 단어를 5회 입력하고 싶으면 ‘5iLove' 라고 적어 주면 된다. ’5‘는 반복하고자 하는 횟수, ’i'를 누르면 “Insert Mode"로 변경되고, ‘Love‘를 입력하고 를 누르는 순간 'Love' 라는 단어가 5회 입력 되게 된다. 마찬가지로 '5o' 는 커서가 위치한 줄에 5개의 빈 줄을 추가 할 수 있게 해준다.

3.7 저장, 빠져 나가기
지금까지 익힌 vi 명령을 통해 기본적인 편집을 할 수 있게 되었다. 이제 지금껏 정성들여 편집한 문서를 저장하고 종료할 차례이다. 문서를 저장하거나 종료하기 위해서는 “Normal Mode"에서 ':' (콜론)을 쳐 “Command Mode"로 들어가야 한다. 일단 "Command Mode"로 들어오면 아래 그림처럼 좌측 하단에 ':' 이 적히게 되고 명령을 기다리게 된다.

이 상태에서서 파일을 저장하기 위해서는 'w' 명령을 사용하면 된다. 우리가 쉘 상에서 vim을 구동할 때 vim test.txt 처름 파일 이름을 지정한 경우에는 그냥 'w' 명령만 내리고 를 치면 test.txt 라는 이름으로 파일을 저장하게 된다. 만일 다른 이름으로 파일을 저장하고자 한다면 'w 파일이름‘ 으로 명령을 내린뒤 를 치면 된다.

다른 이름으로 파일 저장 종종 편집하고자 하는 파일의 소유권이 자기 자신에게 있지만 권한이 없는 파일을 vim 으로 열어 열심히 편집한 뒤에 저장을 하려고 할 때 쓰기 권한이 없어 파일을 저장하지 못하는 경우가 있다. 이 때 물론 다른 이름으로 저장할 수도 있지만 'w!'처럼 ‘w'뒤에 '!'를 함께 적어주어 강제로 파일을 저장시킬 수 있다. 파일을 저장한 후 vim을 종료하는 명령은 'q' 이다. 물론 'q' 역시 "Command Mode"에서 입력을 해주어야 한다. 만약 저장하지 않은 상태에서 모든 편집을 취소하고 vim을 종료하고 싶으면 'q!'처럼 뒤에 ‘!'를 추가해 주면 된다. 끝으로 저장과 동시에 종료 할 수도 있는데 이때는 ‘wq' 와 같이 'w'와 ’q'를 나란히 같이 적어주면 된다.

4. 추가적인 편집 명령

지금까지 아주 기본적인 편집 명령을 살펴보았다. 지금까지 몇 안되는 편집 명령을 알아보았지만 Mode 변화에 익숙하기만 해도 vi 의 반 이상은 배운 것이라 해도 과언이 아니다. 앞으로 몇가지 명령들을 차근차근히 익히다 보면 편집 속도가 눈에 띄게 증가하게 될 것이다.

4.1 이동
이전 장에서 문자 단위로 이동하는 것을 연습해 보았다. 이번에는 단어 및 페이지 단위 이동과 줄에서 시작 및 끝으로 이동하는 방법을 배워보도록 하겠다. 아무래도 단어 단위로 이동하게 되면 문자 단위로 이동하는 것보다 이동 속도가 훨씬 빠를 것이다. 한 단어 오른쪽으로 이동하는 명령은 'w', 왼쪽으로 이동하는 명령은 'b' 이다. 여기에서 알파벳이나 숫자를 제외한 모든 문자도 하나의 단어처럼 취급을 한다.

You'll take away the

위와 같은 문장의 시작에서 차례로 'w'를 누르게 되면 다음과 같이 커서가 이동할 것이다.

You'll take away the

이와 달리 대문자인 'W' 와 'B' 명령은 단어를 오로지 Space 로 구분하게 된다. 즉 위의 문장의 시작에서 'W'를 누르면 따옴표와 'l' 로는 커서가 이동하지 않고 다음처럼 이동할 것이다.

You'll take away the

다른 명령과 마찬가지로 '2w', '3b' 와 같이 단어 이동 명령 앞에 숫자를 사용하게 되면 해당되는 크기만큼 명령을 반복하게 된다. "Normal Mode"에서 '0' 이나 '^' 명령은 줄의 시작으로, '$' 는 줄의 끝으로 이동하는 명령이다. 파일 내에서 원하는 줄로 이동을 시킬 수도 있다. 실습을 위해 "Command Mode" 로 들어가 "set number" 라는 명령을 입력해 보도록 하자.

:set number

그러면 다음 그림과 같이 파일 내용을 줄 번호와 함께 보여주게 될 것이다. 자 이제 다시 "Normal Mode"에서 '3G', '5G' 와 같이 명령을 내리면 3번째 줄, 5번째 줄로 이동하게 된다. 즉 원하는 줄로 이동하고 싶을 때는 'G' 명령 앞에 원하는 ‘줄의 번호’를 적어 주면 된다. 줄의 번호를 보고 싶지 않다면 다시 "Command Mode"에서 "set nonumber" 라는 명령을 주면 된다.

:set nonumber

이렇듯 번호가 보이지 않는 상태에서 현재 자신이 몇 번째 줄에 있는지, 그리고 전체 파일 중 어느 정도 즈음에 있는지 알고 싶을 때는 'Ctrl+g' 명령을 내려주면 된다. 끝으로 자주 사용하는 이동 명령 중에 페이지 단위 이동이 있다. 한 페이지 위는 'Ctrl+u', 페이지 아래는 'Ctrl+d' 명령을 내려주면 된다. Up and Down 의 첫 번째 문자라고 생각하면 익히기가 쉬울 것이다.

4.2 단어 삭제(2d3w)

한 문자를 삭제하는 명령은 'x' 였다. 그럼 한 단어를 삭제하는 명령은 무엇일까? 바로 ‘dw' 명령이다. 'dw' 명령은 반복 명령과 함께 사용하면 여러 단어를 한꺼번에 삭제 할 수 있는데, 그 횟수를 어디에 적어 주느냐에 따라 의미가 약간씩 달라지게 된다. '3dw' 는 단어를 3회 삭제하는 것이고, 'd3w'는 3단어를 삭제하는 것이다. 결과적으로 동일하게 커서 다음의 3단어를 삭제하게 된다. 그럼 '2d3w' 는 무엇일까? 바로 3단어를 2회 삭제하게 되는데, 이렇게 되면 커서 다음의 총 6단어를 삭제하게 된다.

A love like ours is love that's hard to find

위의 예에서 커서가 처음 love 의 'l' 에 있고, '3dw' 혹은 'd3w' 명령을 내리면 'love like ours' 3 단어가 삭제 된다. 현재 위치에서 라인 끝까지의 삭제는 'd$' 이다.

A love like ours is love that's hard to find

위에서 that의 ‘t'에 커서가 있고, 'd$' 명령을 내리면 줄의 ’that's hard to find' 모두가 삭제 될 것이다. 마지막으로 삭제 명령인 'd'와 잘 어울릴 수 있는 명령 중에 'f' 명령이 있다. 'f'는 같은 줄 내에서 특정 문자가 있는 곳으로 커서를 옮겨주는 명령이다. 다음 문장에서 'fe' 명령을 문장내에 'e' 이 있는 곳으로 커서가 이동하게 된다.

A love like ours is love that's hard to find

'df' 명령은 지금까지 ‘d' 명령의 특징을 이해하신 분이라면 금방 눈치를 챘을 것이다. 바로 특정 문자가 있는 곳까지 모든 문자를 삭제하게 된다. 위 문장의 처음 위치에서 'dfe' 라는 명령을 내리면 다음과 같이 A love 까지가 삭제 되게 된다.

like ours is love that's hard to find

4.3 .

. 은 vi 의 여러 명령 중에서 가장 간단하면서도 또한 강력한 명령이기도 하다. 명령은 가장 최근에 수행했던 삭제 명령을 반복 수행하게 해준다. 만약 가장 최근 삭제 명령이 'dd' 였다면 현재 위치에서 . 명령을 실행하면 한 줄이 삭제 된다. 최근 명령이 dw 였다면 . 명령은 한 단어를 삭제할 것이다. 즉 가장 최근에 어떤 삭제 명령을 내렸느냐에 따라 . 명령은 달리 동작하게 된다. 다음과 같이 'f<' 와 'df>', '.' 명령을 잘 조합하면 HTML 태그를 제거할 수 있을 것이다.

We've come too far to leave it all behind 'f<', 'df>','j' 삭제
How could we end it all this way? f<.f<.' strong 태그삭제

When tomorrow comes and we both regret
The things we said today

'f<.'

삭제

4.4 매크로

명령은 간단한 조작으로 같은 명령을 반복 실행할 때 유용하였다. 여러 명령을 반복 실행하기 위해서 매크로를 사용할 수 있다. 매크로는 "Normal Mode"에서 q 명령으로 등록을 시작하여 q 로 등록을 마친다. "Command Mode"의 q 명령과 혼동하지 말기 바란다. 매크로의 이름은 알파벳 소문자 하나로 정할 수 있다. 그리고 매크로는 @으로 실행한다. 만약 매크로 이름이 a 였다면 @a 로 매크로를 실행할 수 있을 것이다.
위의 태그 없애기를 매크로를 사용하여 다시 해보기로 하자. 먼저 매크로를 등록해 보면

qa ^ 'a'라는 매크로 등록
f< 시작 줄의 시작으로 이동
df>> '<' 문자로 이동 '>' 까지 삭제

q

매크로 등록 마침

위의 매크로를 태그제거에 응용해 보면

We've come too far to leave it all behind @a 삭제
How could we end it all this way? 2@a strong 태그삭제

When tomorrow comes and we both regret
The things we said today

@a

삭제

이렇듯 간단한 매크로 활용으로도 편집속도를 높일 수 있다.

4.5 기타(덮어쓰기, 줄합하기, 대소문자 변경)

'r' 명령은 현재 커서에 있는 문자를 'r' 다음에 오는 문자로 덮어쓰기를 한다.tomorrow 커서가 현재 't' 위에 있고 '5ra' 라는 명령을 내리면 커서 뒤로 다섯 문자를 a 로 덮어써 aaaaarow 로 변경을 시킬 것이다. 'R' 명령은 를 누르기 전까지 모든 문자를 키보드에서 입력하는 문자로 덮어쓰게 된다. 현재 줄과 다음 줄을 하나로 합하기 위해서는 'J'를 이용한다. 'J' 명령은 줄 내의 어디 곳에서든 사용할 수 있으며 이 명령을 내리면 두 줄이 하나로 합해진다. 대소문자는 '~' 명령으로 간단히 변경시킬 수 있다. 다음과 같은 문장의 처음 위치에서 '3~' 명령을 주면 tomorrow 처음 세 개의 소문자를 대문자로 변경시키게 되어 TOMorrow 로 바뀌게 된다.

5. 정리

이번 회를 통해 vi 의 기본적인 편집 명령을 알아보았다. 주로 간단한 명령 위주로 설명을 했지만 적은 분량은 아니라고 생각한다. 처음엔 약간 손에 익지 않더라도 몇 번씩 꾸준히 연습하다보면 자기도 모르게 손이 먼저 움직이게 될 것이다.

h, j, k, l
x
u, Ctrl+U
i, a
dd
o, O
w, b
dw
d$
df
.
q, @r,
R
J
~

좌, 하, 상, 우 로 한 문자씩 이동
한 문자 삭제
Undo, Redo
"Insert Mode"로 전환
한줄 삭제
한줄 추가(커서 밑줄, 커서 윗줄)
단어 단위 이동(우, 좌)
한 단어 삭제
현재에서 줄 끝까지 삭제
해당하는 문자까지 삭제
최근 삭제 명령 재 실행
매크로 등록 및 매크로 실행
덮어쓰기
줄합하기
대소문자 변경

We've come too far to leave it all behind @a 삭제
How could we end it all this way? 2@a strong 태그삭제

When tomorrow comes and we both regret
The things we said today

@a

삭제



And