빔파이어 - 죽지 않는 흡혈귀 되기!

vim에 푹빠진 많은 사람들은 자신들을 Vim Lovers, 심지어 빔파이어(Vimpires, Vim + inspires?)라고 부르며 세계 곳곳에 온라인 소굴을 만들었다.[25] 이 문서에서도 어느 정도의 명령어와 팁들을 소개하겠지만 이들 빔파이어들이 준비한 가공할 무기들에는 미치지 못할 것이다 - vi를 더 잘 쓰기 위해서라기보다 GNU/Linux에서의 일처리를 더 잘 하고 싶다면 이들의 웹싸이트를 참고하기 바란다.

명령 모드에서의 기본 명령

move / copy paste delete replace / undo / find

문서 편집의 기본은 단연 파일 내에서의 이동과 복사, 붙여넣기, 삭제 등의 일이다. vi는 명령 모드에서 간단한 키 조합으로 이런 작업을 빠르고 세밀하게 할 수 있도록 해준다. 당당한 Vimpire가 되기 위해 꼭 기억할 것이 있다 - 화살표 키나 PageUp/Dn 등 멀리 있는 키에까지 절대로 손을 뻗지 말자! vi의 내부 명령들은 키보드의 기본 위치 부근에 있는 것들, 즉 문자와 숫자, 기호, 제어키(Ctrl, Shift 등) 정도만으로도 모두 이용할 수 있다.

커서 이동
h j k l - 문자 단위 이동

키보드에[26] 나열된 순서대로 왼쪽(h), 오른쪽(l), 그리고 위(k), 아래(j) 순이다. 이 편안한(?) 키들을 익히지 않고 끝까지 화살표 키를 고집하지 말기를!

w b - 단어 단위 이동

이들은 한 단어를 단위로 해서 커서를 앞 뒤로 이동시킨다. 호기심이 많다면 w W b B을 모두 실험해 보자.

어떤 줄 내에서 그 줄의 처음으로 가는 키는 |(파이프 문자), 마지막으로 가는 키는 $ 문자다 - 줄의 처음과 끝으로 가면서 입력 모드로 전환하는 키(I A)도 있음을 기억할 것이다.

Ctrl-f / b - 페이지 단위 이동

Ctrl-f는 앞으로(forward), Ctrl-b은 뒤로(backword) 한 페이지씩 넘긴다. 또 강조하는데, PgUp/Dn 키를 이용하지 말자!

gg G 123g - 문서, 줄번호 단위 이동

gg는 그 파일의 처음으로, G는 끝으로 단 번에 이동한다. 그리고 문서의 특별한 줄 번호로 곧바로 찾아가려면 원하는 줄 번호를 입력하고 G를 누른다. 예를들어 1G 명령은 gg와 같다.

복사, 붙여넣기, 삭제, 덮어쓰기
y[move] - 복사하기 (yank)

y를 먼저 누르고 이동명령을 하면 실제 커서는 움직이지 않지만 해당하는 구간의 텍스트가 버퍼(buffers[27])에 저장된다. 예를들어 한 단어의 첫 글자 위에서 yw라고 하면 그 단어가, 한 줄의 임의 위치에서 y$라고 하면 그 위치에서 줄 끝까지의 내용이 복사된다. 복사된 내용을 어떤 위치에 붙여 넣으려면 일단 그 위치로 이동한 후, 다음에 소개되는 붙여넣기 명령을 한다.

자주 이용하는 복사명령은 대개 한 줄 전체에 대한 것이며 이때는 yy 명령을 하면 된다.

p P - 붙여넣기 (paste)

위에서 소개한 복사하기 기능이 실제로 어떻게 동작하는지 확인해 보자. yy로 한 줄 전체를 복사한 후 p를 누르면 현재 줄의 다음 줄에, 그리고 P를 누르면 앞 줄에 내용이 삽입된다. 이것은 단어 단위 또는 단락 단위로 복사한 내용에 대해서도 마찬가지다 - 즉, yw로 한 단어를 복사한 경우에도 p는 현재 커서의 다음 위치에, 그리고 P는 그 이전 위치에 (커서에 있는 문자를 뒤로 밀어내며) 내용이 삽입된다.

d[move] x - 지우기 (delete)

입력 모드에서는 백스페이스(BackSpace) 키로써 "왼쪽으로" 한 글자씩 지울 수 있지만, 일반적으로 명령 모드에서는 이 키가 동작하지 않는다. 명령 모드에서 커서가 위치한 글자를 하나씩 지우려면 x를 이용한다; 이때 커서 위치는 고정되어 있고 대신 커서 이후의 문자들이 하나씩 "끌어당겨"지는 것에 주의.

복사하기 위해서 y와 이동명령을 차례로 누르는 것과 마찬가지로, 텍스트를 지울 때도 d와 이동명령을 이용할 수 있다. 예를들어 한 단어를 지울 때는 dw, 커서 위치에서 줄 끝까지 지울 때는 d$(또는 D)라고 하면 된다. 한 줄 전체를 지울 때도 yy와 유사하게 dd 명령을 한다. 참고로 어떤 단위로 삭제하더라도 그 삭제된 내용이 일단 버퍼에 기억됨을 '기억'하자.

r R - 덮어쓰기 (replace)

현재 커서가 위치한 곳의 문자 하나를 다른 것으로 바꾸려 할 때, 그것을 x로 지우고 입력 모드로 전환해서 새 문자를 입력하는 수고를 하지 말자. 바꿀 문자에 커서를 둔 채 먼저 r을 한 번 누르고 새 문자를 입력하면 된다.

대문자 R을 누르면 Esc를 누르기 전까지 입력하는 모든 텍스트가 원래 있던 것을 덮어쓰며 입력된다.

v Ctrl-v - 블럭 선택하기 (visual block)

이들은 텍스트를 복사하거나 잘라낼 때 시각적인 블럭을 지정할 수 있도록 하는 명령이다. v를 누르고 커서를 움직이면 다들 익숙해져 있을 방식으로 텍스트가 선택되며, Ctrl-v의 경우 아래아한글 소프트웨어에서의 구역(열) 블럭과 같은 방식으로 선택된다. 이들 명령을 시작하면 vi 화면의 메시지(가장 아래 있는 한 줄)에 -- VISUAL -- 이라는 말이 보이고, 선택한 영역의 텍스트도 반전되어 나타나므로 다른 상태와 쉽게 구별할 수 있을 것이다. 블럭 선택을 취소하려면 Esc 키를 누른다.

블럭을 다 선택했다면 복사(y), 잘라내기(c - cut), 그리고 지우기(d) 명령을 할 수 있는데 - 잘라내기와 지우기는 사실상 차이가 없다. 앞서 언급했듯이, 지워진 내용도 일단 버퍼에 저장되어 버리기 때문이다.

되살리기, 문자열 검색
u U - 되살리기 (undo)

방금 지운 내용을 되살리거나, 또는 입력한 내용을 취소하려면 u 명령을 한다. 이것을 계속 누르면 결국 그 문서를 처음 열었을 때의 상태로 가 버리므로 주의해서 이용하자.

/[string] n N - 문자열 찾기 (find), 다음 찾기 (next)

명령 모드에서 슬래쉬(/) 문자를 누르면 가장 아래 줄에 / 라는 프롬프트가 뜨고, 커서의 위치도 그 프롬프트 문자의 바로 옆으로 간다. 만약 파일에서 찾고자 하는 문자열이 있으면 그 곳에 입력하고 엔터 키를 치면 된다. 예를들어 어떤 문서에서 "C P U"라는 문자열을 찾고 싶다면 /C P U, 이렇게 한다. 문서 안에 있는 해당하는 부분들이 반전되어 나타나고 커서는 처음 해당하는 "C P U"로 이동하게 된다.

이렇게 검색된 부분들을 따라 커서를 빨리 이동시킬 수 있다. n 명령은 문서의 진행 방향으로, 그리고 N 명령은 반대 방향으로, 해당하는 문자열로 커서를 이동시킨다.

/ 문자는 어떻게?

슬래쉬 문자나 인용 부호 등 다른 의미로 오해받을 수 있는 특별한 문자들을 표현하려면 백슬래쉬 문자(\)를 이용한다. 예를들어 /home/jedi/ 라는 문자열을 찾으려면 /\/home\/jedi\/라고 하면 된다. 위의 보기에서 C P U 라는 문자열을 검색하는 경우에도 올바른 표현은 /C\ P\ U, 즉 공백문자도 \ 문자로써 명확히 표현해 주는 것이다. 물론 백슬래쉬 문자 자체도 \\으로 표현할 수 있다.

Ex 명령 프롬프트

set / substitution / abbreviation

명령 모드에서 : 문자를 입력하면 Ex 프롬프트 상태로 가고, 몇 가지 예(저장, 종료 등)를 앞에서 접했다. Ex 프롬프트에서 할 수 있는 일은 어쩌면 지금까지 명령 모드에서 했던 것을 합친 것보다도 더 많을 수 있지만 이 문서에서 그 모든 것을 다 소개하진 않겠다. 자주 쓰이는 중에서도 쉽게 따라해 보고 활용할 수 있는 것들만 정리해 보자.

자주 쓰이는 Ex 모드 명령들
:set [option[=value]] - 편집 환경 설정 (setting)

먼저 :set 명령을 그냥 실행해 보면 누구 짓인진 몰라도 이런 저런 설정값들이 만들어져 있음을 알 수 있다. 이렇게 설정된 환경을 그대로 이용해도 되겠지만 필요하다면 다음과 같은 유용한 사용자 설정도 해보자.

:set nu                       # 줄 번호가 보이도록 (number)
:set cin                # C/C++/Java 프로그래밍에서 자동 들여쓰기 (cindent)
:set ts=4               # 탭(tab) 문자의 너비; 여덟 자는 너무 크다. (tabstop)

보기에서처럼 nu, cin, ts라고 쓰지 않고 길고 정확히 써도 물론 상관없다(예를들어 :set number). 그리고 설정한 내용을 해제하려면 :set nonu처럼 no를 명시해 준다. 이상은 vi라는 프로그램의 동작에 관한 설정일 뿐, 실제 파일의 내용은 전혀 변화가 없음을 기억하라.

:%s/old_string/new_string/g - 문자열 바꾸기 (substitution, find and replace)

문자열을 대치하는 이 명령의 보다 장황한(?) 이용법은 :[range]/old_string/new_string/[option]이다. 하지만 실제 이용자들이 가장 자주 쓰는 형태는 "문서 전체에서" "단 번에" 바꾸는 것이다. 앞서 소개한 찾기(/[string]) 명령과 마찬가지로 공백 문자나 특수 문자들을 표현하기 위해 백슬래쉬 문자를 이용한다. 몇 가지 자주 쓰이는 예를 보며 참고하자.

:%s/_cpu/Computational Physics Unlimited/g
:%s/_phys/Department of Physics/c
:%s/\t/  /g

처음 명령은 문서 전체에서 "_cpu"를 찾아 전체 이름으로 대치시킨다. 두 번째 명령도 이와 유사하지만 global 대신 confirm 옵션을 이용해서 귀찮게도(?) 매번 대치시킬 것인지 물어본다. 세 번째 명령에서는 자주 쓰는 특수 키인 탭 키를 \t로 표현함을 알 수 있다(탭 키를 모두 찾아 공백 문자 두 개로 대치).

:ab short very_long_string - 줄여 쓰기 (abbreviation)

줄여 쓰기 기능은 텍스트를 입력할 때 긴 문자열을 단 번에 입력하거나 또는 예상되는 오탈자를 자동으로 교정해 주는, 일반 워드프로세서에서도 흔히 이용되는 기능이다. 예를들어 :ab 3d 3-Dimension 명령을 한 이후로는 입력 모드에서 "3d"라고만 쳐도 저절로 "3-Dimension"이 입력된다.

이렇게 줄여 쓸 수 있는 문자열이 어떻게 정의되어 있는지 확인하려면 그냥 :ab 명령을 해보자.

설정 파일, 그 외의 사용팁

.vimrc .viminfo / :!(shell command) / edit

vim은 다른 소프트웨어들과 마찬가지로 /usr/share/ 아래에 있는 해당 디렉토리에서 설정 파일을 읽어들이며 동작한다. 그러므로 개인적으로 아무런 설정을 하지 않았다면 바로 그 파일에서 결정된 환경을 이용하게 된다. vi 자체가 열리는 파일의 확장자에 따라 문법 하이라이팅[28], 자동 들여쓰기 등 일반적으로 유용한 기능을 잘 제공하지만, 그래도 많은 이용자들이 저마다의 손 맛(?)을 원하기 때문에 각자 따로 정의한 설정 파일도 이용할 수 있도록 해 준다. 이것은 vi 뿐만 아니라 GNU/Linux 시스템에서 돌아가는 모든 소프트웨어들이 지키려고 하는 원칙이기도 하다.

Vim의 사용자 설정 파일
~/.vimrc - 사용자 환경 설정 파일

각 이용자가 자신의 홈디렉토리, 즉 ~/에 놓아두고 이용할 수 있는 파일이다. 이 파일이 있는지 확인해 보고, 없다면 지금 만들어 보자. (여기선 간단히 abbreviation의 활용만 보임)

$ vi ~/.vimrc
ab _cpu Computational Physics Unlimited
ab _home http://cpu.phys.cau.ac.kr/
:wq                     # (명령 모드에서!) 저장하고 종료

이제부터는 자신이 vi를 실행할 때마다 이 파일의 내용이 읽혀지고, 따라서 어떤 파일에서든 _cpu, _home과 같이 짧은 입력으로도 전체 문자열을 입력할 수 있다. 보기로 든 것은 매우 간단한 경우지만, 빔파이어들의 소굴에 가보면 틀림없이 유용하게 설정된 ~/.vimrc 파일을 누구나 다운받을 수 있도록 배려해 줄 것이다. 자신이 직접 만들어 보고 싶다면 시스템에 설치된 Vim 패키지에 포함되어 있을 샘플을 복사해서 연구해 보자 - /usr/share/vim/vim60/vimrc_example.vim.

~/.viminfo - vi가 생성하는 파일

한편, vi를 이용하다 보면 시키지도 않았는데 상당히 많은 것을 기억하고 있다는 사실을 알아챌 것이다. 예를들어 어떤 파일을 열었는데 예전에 종료했던 줄 번호로 알아서 찾아간다거나, 또는 Ex 모드에서 내렸던 명령들을 (마치 Bash의 히스토리처럼) 기억하는 등; 이렇게 각자가 vi를 이용했던 내역도 자신의 홈 디렉토리의 파일, ~/.viminfo에 저장된다.

~/.viminfo 파일을 열어 보면 vim 프로그램 자신이 만들었다; 재주 있으면 알아서 편집해 써라; 이런 말이 있을 것이다. 이 문서에서도 이와 똑같은 말을 해야겠다 :-)

vi는 어지간해서 모든 명령어를 알 수도 없고, 또 그럴 필요도 없다. 처음 이것을 접한 많은 사람들은 누가 시키지도 않았는데 주요 명령어와 기능을 요약해서 모니터 옆에 붙이고, 그것에 먼지가 쌓일 때쯤 되면 "이제 나도 피 맛을 알아!"라면서 떼내어 버리곤 한다. 아마도 이런 도움말 카드를 빔파이어들의 온라인 소굴에서도 찾아볼 수 있을 것이다.

당연한 이야기겠지만, vi를 잘 아는 것보다 잘 이용하는 것이 중요하다. 하루종일 명령어들을 암기하고 있지 말고 틈나는대로 파일을 열어보고 또 내용을 편집해 보자! 그러다가 어느 날 문득 ... 다른 문서 편집 소프트웨어를 쓰면서 무의식 중에 h j k l : Esc 키를 열심히 누르고 있는 자신의 모습을 발견한다면 그 때가 바로 새로운 빔파이어가 탄생한 순간일 것이다.

vi를 이용하는 몇 가지 팁
:!(shell command) - 쉘 명령 실행

vi를 이용하는 중에 종종 쉘의 다른 명령 또는 다른 프로그램을 실행해야 될 때가 있다. 이 때는 다음과 같이 하자.

:!ls                        # Ex 프롬프트에서 ! 문자, 그리고 명령
:sh                     # 쉘로 잠시 빠져 나간다.

두 번째 명령 :shvi 실행 중에 "잠시" 빠져 나가는 것이다. 따라서 쉘에서 작업이 끝나고 $ exit, 즉 쉘 종료 명령을 하면 다시 vi의 실행 화면으로 돌아온다.

K - 함수에 대한 매뉴얼 페이지

GNU/Linux 시스템에서 매뉴얼 페이지를 참고하기 위해 man 명령을 한다고 했다. vi로 편집 중인 상태에서 어떤 함수 이름 위에 커서를 놓고 Shift-k(K)를 눌러 보자. 예를들어 printf 함수 위에서 이렇게 하면 man 3 printf를 실행했을 때의 결과가 뜰 것이다.

:e [filename] - 다른 파일 편집

현재 편집 중인 파일을 저장하고 또 다른 파일을 편집해야 된다면 굳이 vi를 종료할 필요가 없다. Ex 명령 모드에서 :e filename 명령을 하면 된다. Bash의 기능처럼 이 경우에도 자체적인 자동 완성(auto-completion) 기능을 쓸 수 있어서 편집하려는 파일의 처음 몇 글자만 입력하고 Tab 키를 눌러서 전체 이름을 빨리 입력할 수 있다.



[25] 한국의 경우 vi.kldp.org라는 곳이 있다.

[26] Qwerty 자판을 기준으로 함

[27] 임시 기억장소; 컴퓨터의 모든 분야에서 종종 접하게 되는 용어다. 특별히 텍스트 버퍼란 마우스나 키보드로 선택한 영역, 또는 주로 Ctrl-c 명령으로 '저장한' 내용을 말한다.

[28] syntax highlighting - 앞서 보인 실행 모습 참고