본문 바로가기

운영체제/리눅스

[처음부터 다시 배우는 리눅스] ③ vim 편집기 활용법

[처음부터 다시 배우는 리눅스] ③ vim 편집기 활용법

 

연재순서
1회.
개발자를 위한 리눅스 설치와 기본 명령어
2회. 고급 리눅스 명령어와 중요 시스템 관리
3회. 개발자를 위한 vim 편집기 사용법
4회. 오픈소스 프로젝트의 필수 개발툴 활용 <끝>

 

사용자의 입장에서 윈도우와 가장 두드러지게 눈에 띄는 리눅스, 그리고 다른 유닉스 운영체제의 차이점은 무엇일까? 여러 차이점, 특히 관습이나 문화적인 차이점도 많이 있겠지만 vi 에디터의 독특함도 중요하게 작용하고 있다고 본다.

최근 들어서는 유닉스를 처음 배우면서 에디터로 vi를 반드시 배워야 하는 상황은 많이 줄었지만 여전히 vi는 많이 쓰이고 있으며 그 편리함과 독특한 매력은 많은 사용자를 확보하고 있다. 아직까지 vi를 제대로 쓰지 않고 리눅스를 사용하고 있다면 이번 기회에 조금 귀찮더라도 반드시 vi 기본 명령어는 습득해 보도록 하고, 또 추가로 많이 쓰이는 vi 관련 설정을 살펴보기로 하자.

vi를 처음 접하는 사람에게 가장 까다롭게 느껴지는 것은 vi가 소위 명령어 모드(command mode)와 입력 모드(input mode)가 나뉘어져 있다는 특성 때문이다. vi를 처음 실행시키고 타이핑을 해보면 아무런 글자도 입력되지 않고 심지어는 비프음까지 동반하게 되는데 많은 사용자들이 이런 vi의 편집기답지 않은 황당한(?) 모습에 금방 거부감을 갖게 되는 경우가 많다. 하지만 일단 vi의 명렁어 모드와 입력 모드의 차이점을 인식하고 몇 가지 커서 이동 명령어만 학습하고 나면 vi의 매력을 금방 느낄 수 있으니 겉모습만을 보고 오해해서 vi를 버리지 말도록 하자.

vim은 정확히 말하자면 여러 vi 클론들 중의 하나이다. vim의 이름은 vi improved에서 따왔다고 하는데 vim은 기본적인 vi의 기능에 덧붙여서 여러 개의 파일을 동시에 편집한다든가 프로그램 소스코드에 색깔을 덧붙여 가독성을 높여주는 syntax highlighting과 같은 기능을 추가로 지원한다.

pico, nano
우선, vi를 배우는 동안 간단히 쓰기 좋은 에디터로는 pico나 pico의 자유 소프트웨어 클론인 nano를 권장한다(젠투 리눅스는 시스템 설치 과정에서 nano를 사용한다). pico나 nano는 어느 배포판이나 기본으로 설치되어 있는 경우가 많으며 명령어 안내가 간단하게 화면 아래쪽에 출력되기 때문에 불편하지만 쉽게 쓸 수 있다. 오래 전 PC통신 시절의 경험이 있는 사용자라면 이미 pico를 많이 사용해 보았을 수도 있다. pico의 사용 방법은 무척 간단하기 때문에 여기서는 생략하도록 한다.

명령어 모드와 입력 모드
앞에서 잠깐 얘기했듯이 vi는 명령어 모드와 입력 모드가 나뉘어서 동작한다. 예를 들어 명령어 모드에서는 h 키를 누르면 왼쪽 화살표 키와 같이 커서가 왼쪽으로 한 칸 이동하지만 입력 모드에서는 화면에 h 글자가 입력된다.

vi는 실행되었을 때 기본으로 명령어 모드가 작동된다. 따라서 vi를 실행한 뒤 아무리 키를 눌러봐야 글자가 타이핑되지 않는다. 입력 모드로 들어가기 위해 i 키(insert, 삽입)를 눌러 보자. i 키를 누른 이후로는 타이핑이 될 것이다. 참고로 a 키를 누르면 커서 다음 글자부터 입력이 된다. 추가로 대문자 I와 A의 차이점도 직접 확인해 보자.

서너 줄 정도 간단한 글을 입력한 다음 이제 다시 명령어 모드로 돌아가기 위해 esc 키를 눌러보자. esc 키는 vi에서 가장 중요한 키 중의 하나이며 esc를 누르면 vi는 항상 명령어 모드로 돌아간다. 여기서 다시 i나 a 키를 누르면 삽입 모드로 들어간다(한 줄을 비우고 삽입 모드로 들어가는 o와 O도 시험해 보자). 이제 esc 키를 눌러서 명령어 모드로 돌아간 뒤 커서를 상하좌우로 이동해보자.

요즘은 상황이 많이 달라졌지만, vi에서는 화면 상의 커서를 상하좌우로 이동하기 위해 키보드 위의 상하좌우 화살표 키를 원칙적으로 쓰지 않는다. vim에서는 화살표 키를 써도 커서 이동이 가능하지만 일단은 vi에서는 화살표 키를 쓰지 않는 습관을 들여 보자. vi에서는 커서 이동키로 h(좌), j(하), k(상), l(우)을 사용한다. 한 페이지 위로 올라갈 때는 pgup 키 대신 , 한 페이지 아래로 내려갈 때에는 pgdn 키 대신 를 사용한다. <표 1>를 참조해서 커서 이동키를 외우도록 하자.

<표 1> vi의 커서 이동 키

 

명령어

내용

왼쪽

h

오른쪽

l

위쪽

k

아래쪽

j

한 페이지 위로

<ctrl+v>

한 페이지 아래로

<ctrl+f>


vi에서는 왜 이렇게 낯선 커서 키 배열을 사용할까? 그 이유 중 하나는 vi가 커서 키로 사용하고 있는 h, j, k, l 키가 화살표 키보다 사용하기 훨씬 편리하기 때문이다. 다만 vi의 키 배열은 아무래도 처음 익숙해지고 외우기까지가 불편하다. 하지만 vi의 명령어 키는 모두 기본 자판만을 사용하기 때문에 커서를 움직이거나 페이지를 스크롤 하기 위해 오른손을 들어 화살표 키가 있는 곳까지 손을 뻗는 수고를 덜어준다. vi를 오래 쓰다보면 윈도우에서도 무심코 esc 키를 누르고 j, k 키를 눌러 커서를 무심코 이동시키려는 중독 증세가 나타나 간혹 사람을 당황하게 하는 경우도 생긴다.

일단 h, j, k, l 커서 키와 페이지 업, 페이지 다운 키로 , 에 익숙해진 다음 몇 가지 이동키를 더 익혀보자. 한 단어를 이동하는 키는 w, 한 단어를 뒤로 이동하는 키는 b이다. 시프트 키를 누르고 대문자 W, B를 누르면 띄어쓰기가 된 단어 단위로 커서가 이동한다. w와 비슷한 기능으로 e를 들 수 있는데 e 키는 커서가 단어의 맨 뒷부분에 위치하게 된다.

추가로 워드프로세서에서 Home 키에 해당하는 vi의 키는 0이고 End에 해당하는 키는 $이다. 윈도우 환경에서는 Home이나 End 키를 안 쓰는 사람도 많지만 vi에서는 많이 쓰이니 반드시 익혀두자. 여기에 커서 이동키로서의 (, ) (문장 단위 이동), {,} (문단 단위 이동), H, M, L(화면 첫줄, 가운뎃줄, 마지막줄) 키, 1G (첫줄), G(마지막줄)의 쓰임새까지 학습하고 나면 vi로 가장 기본적인 문서 편집을 하는 데는 문제가 없게 된다.

<표 2> vi의 추가 커서 이동키

 

명령어

내용

줄의 가장 처음(Home)

0

줄의 가장 마지막(End)

$

한 단어 오른쪽으로

w, W, e, E

한 단어 왼쪽으로

b, B

한 문장 오른쪽으로

(

한 문장 왼쪽으로

)

한 문단 오른쪽으로

}

한 문단 왼쪽으로

{

화면의 첫 줄, 가운데 줄, 마지막 줄

H, M, L

편집중인 파일의 맨 처음으로

1G

편집중인 파일의 맨 마지막으로

G


여기서 다른 에디터에서는 보기 힘든 vi의 또 다른 중요한 문법을 배워보자. w 키를 사용해 한번에 두 단어, 세 단어를 뛰어 넘어 커서를 움직이려면 어떻게 해야 할까? 방법은 그만큼의 숫자를 w 키를 타이핑하기 전에 먼저 입력해 주면 된다. 즉, 두 단어를 건너뛰고 싶으면 2w, 세 단어는 3w와 같이 타이핑을 해주면 되는 것이다. 같은 방법으로 위로 다섯줄을 올라가고 싶으면 5k, 아래로 열 줄을 내려가고 싶으면 10j와 같은 키 조합을 만들어 볼 수 있다.

vi를 종료하기 위해서는 ‘:’ 키를 눌러서 vi의 전신인 ex의 명령어 모드로 들어가야 한다. : 키를 누르면 화면 맨 아래쪽에 : 프롬프트가 뜨는 것을 볼 수 있는데 여기서 검색이라든가 새 파일 열기와 같은 좀 더 복잡한 명령을 입력할 수 있다. 종료 명령인 q를 누르고 엔터 키를 치면 vi가 종료되는데 지금은 편집 중인 파일이 있는 관계로 vi가 아직 파일이 저장되어 있지 않다는 에러 메시지를 보여준다. 강제로 종료하기 위해서는 :q! 명령을 입력하면 된다. 저장을 하려면 :w <파일이름> 명령을 실행한 뒤 q 명령으로 vi를 종료하자.

보통은 vi로 파일을 편집할 때는 $ vi 과 같이 셸에서 vi를 실행시킬 때 파일 이름을 명시해주고 종료할 때는 :wq 명령어로 저장을 하고 vi를 종료하는 방법을 쓰는 것이 편리하다.

vi에서의 텍스트 편집
삭제
이제 글자 삭제를 해볼 차례이다. 물론 vi의 입력 모드에서는 백스페이스 키가 정상적으로 작동하지만 명령어 모드에서는 백스페이스가 아닌 x 키를 사용한다. 그런데 실제 문서 편집 작업을 하다보면 글자 단위의 삭제보다는 단어나 한 줄 단위, 혹은 커서가 위치한 부분부터 줄 끝까지 삭제를 하는 경우가 많다. 이런 경우에 쓰는 vi 명령키가 d이다. d 다음에는 지울 범위를 설정해 주어야 하는데 다음과 같은 키 조합을 만들어 볼 수 있다.


◆ dw : 커서가 있는 위치부터 오른쪽으로 한 단어 삭제
◆ db : 커서가 있는 위치부터 왼쪽으로 한 단어 삭제
◆ d$ : 커서가 있는 위치부터 문장 끝까지 삭제
◆ d} : 커서가 있는 위치부터 한 문단 끝가지 삭제


앞의 경우와 마찬가지로 vi의 명령어 키 조합을 응용해 보자.


◆ d3w : 커서가 있는 위치부터 오른쪽으로 세 단어 삭제
◆ d5j : 커서가 있는 위치부터 아래로 다섯 줄 삭제


참고로 dd 명령키는 한 줄을 지울 때 사용한다. d$는 D로 간편하게 줄여 쓸 수 있다. 또한 d(delete) 대신에 c (change) 명령키를 사용하면 vi는 삭제 대신에 치환 기능을 수행한다. 치환 기능은 vi가 같은 범위의 d 명령을 수행한 다음 i 키를 알아서 눌러 입력 모드로의 전환까지 자동으로 해준다고 생각하면 된다. 텍스트 편집은 결국 어느 부분을 삭제하고 나면 그 부분을 다른 단어들로 수정하기 마련이며 vi에서는 다른 비주얼한 에디터와는 달리 삭제와 수정까지 치환 기능을 통해 한번에 간편히 해결해 주고 있다. 실제, 필자의 경우는 vi를 쓰면서 d 키보다 c 키를 더 많이 쓰는 편이다. 비슷한 기능키로 s, S와 r도 간혹 사용된다.

자르고 붙이기
윈도우나 기타 GUI 데스크탑 환경에서 자르고 붙이기(cut & paste) 기능은 이해하기도 쉽고 실제 많이 쓰는 기능이다. vi에서는 자르기(cut) 기능은 d 키로 삭제했을 때 삭제된 부분이 자동으로 기억되며, 이것을 소문자 p나 대문자 P 키를 눌러서 붙일(paste) 수 있다. 일례로 문단 하나를 cut & paste하는 경우를 생각해보자. 윈도우에서는 마우스로 해당 부분을 선택하고 풀다운 메뉴에서 「Edit | Cut」 메뉴를 선택하고 커서를 적절한 위치에 놓은 다음 풀다운 메뉴에서 「Edit | Paste」 메뉴를 선택 이런 방식으로 옮긴다.

이것을 vi에서는 d 명령으로 해당 부분을 지우고 커서를 적절한 위치에 놓은 다음 p 명령키로 붙여넣기의 방식을 따른다. 그렇다면 undo 기능은 어떻게 사용할 수 있을까? vi에서 undo 키는 단순히 u 키를 누르면 되며 vim의 경우 redo 기능이 로 추가되어 있다.

복사하고 붙이기
vi에서 복사하고 붙이기(copy & paste)에서 복사 기능을 수행하는 vi의 명령키는 y(yank)이다. d 대신에 y 키를 누르고 복사하고 싶은 부분만큼 선택한 다음 p 키를 눌러서 붙여넣기 작업을 진행하면 된다. y 키 역시 마찬가지로 yw, y$, y}, y10j와 같은 다양한 응용이 가능할 것이다. yy 명령키는 dd와 비슷한 역할을 한다. yy 명령키는 p 명령키와 같이 조합해서 특히 많이 쓰이는 편이다.

두 줄을 한 줄로 합치기
두 줄을 한 줄로 합치기 위해서는 대문자 J 명령키를 사용한다. 반대로, 한 줄을 두 줄로 나눌 때는 r 키와 엔터 키의 조합을 쓰면 편리하다. r 명령키는 커서가 위치한 곳의 문자 하나를 치환(replace) 하고 명령어 모드로 복귀한다. 여기서 잠깐 유닉스의 파이프를 이용한 팁 하나를 알아보자. vi에서는 이렇게 J 키로 두 줄을 합치다 보면 문단의 오른쪽이 들쑥날쑥해지는 것이 그다지 보기 좋지 않은 경우가 많다.

이럴 때 유닉스의 파이프(pipe) 기능을 이용해서 문단 정렬을 해볼 수 있다. 유닉스에는 기본으로 fmt 명령이 제공된다. fmt는 문단을 72컬럼 근처에서 다듬어주는 역할을 한다. 보통 다음과 같은 방식으로 쓰면 document.txt의 문단을 예쁘게 정렬해서 출력해 주는 아주 간단한 유틸리티이다.


$ cat document.txt | fmt


이것을 vi에서 사용해 보자. vi에서는 ‘!’ 키를 누르면 필터(filter)가 동작한다. ! 키를 누르고 처리할 텍스트 범위를 선택한 다음 외부 명령어 이름을 적어준 뒤 엔터를 누르면 그 외부 명령어가 처리한 텍스트 결과물이 다시 vi 편집 화면에 돌아오는 것이다. 이제 한 문단 정렬을 외부 명령어 fmt를 이용해 보자. 방법은 다음과 같다.


[1] 줄이 들쑥날쑥한 문단에 커서를 위치시킨다.
[2] ! 키를 누른다.
[3] } 키를 눌러 커서가 위치한 문단 끝까지 선택한다.
[4] 외부 명령어인 fmt를 타이핑한 뒤 엔터 키를 친다.


이렇게 하면 문단이 fmt를 통해 예쁘게 정렬된다. ! 키를 누른 이후에 선택한 부분이 fmt에 들어가서 포맷팅이 되고, 그 결과가 다시 vi 편집 화면으로 돌아온 것이다. 조금 복잡해 보이지만 vi가 간단한 기능으로도 강력한 성능을 발휘할 수 있는 특징 중의 하나이므로 한번쯤 연습해 보도록 하자. 필자의 경우에는 } 대신 아예 파일 끝부분을 가리키는 G를 이용해서 편집중인 파일 전체를 fmt를 통해 문단 정렬을 자주 하는 편이다.

파일 저장 및 vi 끝내기
파일 열기, 저장, 그리고 vi 끝내기는 : 키를 눌러서 명령어 입력 모드로 전환한 다음 이루어진다. :w 명령어로 편집 중인 파일을 저장할 수 있다. :q 명령은 vi 종료 명령이다. 안전하게 파일을 저장하고 vi를 빠져 나오려면 :wq 명령을 이용한다.

vim의 추가기능
이제 vi의 확장판 클론인 vim의 유용한 기능들을 살펴보기로 하자. vim의 여러 가지 확장된 기능 중에서 우리가 중점적으로 살펴볼 부분은 다음과 같다.


◆ syntax highlighting
◆ 들여쓰기
◆ 다중 윈도우 사용


우선 vim 사용에 편리한 설정 몇 가지를 먼저 살펴보자. vim의 설정은 /etc/vimrc나 ~/.vimrc에 저장해 놓으면 된다. vimrc의 명령어는 vim의 : 명령 프롬프트에서 직접 입력해서 실행하는 것과 동일하다.

vim 사용시 한글 관련 옵션
vim에서 한글을 쓸 때 편집 도중에 한글이 깨지지 않도록 하기 위해서는 vimrc에 다음 옵션을 추가한다.


set fileencoding=korea
set encoding=korea


set fileencoding 명령은 vim이 편집 중인 파일을 저장할 때 어떤 인코딩을 사용할 것인가를 결정해 주고 set encoding은 vim 내부에서 어떤 문자 인코딩을 사용할 것인지를 결정해 준다. 이 옵션으로도 vim에서 한글 단어 단위의 커서 이동이나 한글 문자 삭제시 글자가 깨진다면 bash 셸에서 언어 환경을 한국어로 명시해 주자.


$ export LANG=ko_KR.eucKR


참고로 최근 들어 많은 배포판들이(특히 GNOME 데스크탑 환경에서) 한국어 환경의 한글 코드를 완성형에서 유니코드(utf-8)로 이동했다. 이런 경우는 굳이 앞의 encoding과 fileencoding 설정을 사용할 필요가 없으며 경우에 따라서 utf-8이나 korea를 상황에 맞게 설정해 주면 된다.

[로케일 설정]  
로케일(locale)은 리눅스 시스템의 언어 설정을 가리킨다. 요즘은 윈도우도 윈도우 2000, XP부터 하나의 윈도우에서 여러 나라의 언어를 모두 지원하는 추세가 확립되고 있지만 아직까지도 윈도우는 한글 윈도우와 영문 윈도우가 구분되어 출시되고 있다. 이에 반해 비영어권 사용자의 숫자가 초기부터 많았던 리눅스나 유닉스 계열 운영체제에서는 처음부터 일관된 방법으로 하나의 애플리케이션이 여러 나라의 언어를 쉽게 지원할 수 있는 프레임워크를 만드는 데 신경을 많이 써 왔다. 이러한 작업을 국제화(internationalization, i18n)라고 부른다. 참고로 국제화의 줄임말로 i18n을 쓰는 이유는 국제화의 i와 n사이에 18개의 글자가 있기 때문이라고 한다.

따라서 기본적으로 리눅스 시스템이나 배포판을 한글화한다는 얘기는 일단 리눅스 시스템의 언어 설정을 한국어로 해놓고 필요한 한글 메시지 번역이라든가 폰트 추가 및 설정과 같은 작업을 추가하는 것이 된다. 리눅스 시스템의 언어는 LANG 환경 변수를 통해 설정한다. 로케일 설정에는 LANG 변수 이외에도 여러 가지 다른 설정이 있지만 사용자 입장에서는 LANG 변수만 바꾸어 주면 전체 시스템의 언어가 바뀐다. 한국어의 경우 다음과 같은 LANG 셋팅을 많이 쓴다.

$ export LANG=ko_KR.eucKR

여기서 ko_KR.eucKR의 의미를 짚어보고 넘어가자. 맨 앞의 ko는 언어를 가리킨다. 한국어 이외의 언어를 몇 가지 예를 들어보면 en은 영어, de는 독일어, jp는 일본어를 의미한다. 그 다음 KR은 지역을 나타낸다. 비슷하게 KR은 한국, JP는 일본, US는 미국, CA는 캐나다, DE는 독일과 같은 예를 들어볼 수 있다.

그렇다면 LANG 환경변수 설정에서 왜 ko_KR과 같이 나라와 지역을 같이 쓸까? 그 이유는 같은 나라에서도 여러 가지 언어가 쓰일 수 있으며, 같은 언어라도 여러 나라에서 쓰이는 경우가 있기 때문이다. 일례로 미국에서의 영어는 en_US, 캐나다에서의 영어는 en_CA로 표기한다. 캐나다의 경우 fr_CA의 불어도 쓸 수 있을 것이다. 따라서 우리나라의 경우 ko_KR은 대한민국에서 쓰는 한국어가 된다. 북한은 이 원칙을 따른다면 아마도 ko_KP로 쓸 수 있을 것이다.

그리고 맨 마지막으로 eucKR은 인코딩 방법을 의미한다. eucKR은 현재 우리가 쓰고 있는 완성형 코드이다. 최근 들어 리눅스 배포판은 유니코드로 넘어가고 있는 추세인데 유니코드를 지원하는 리눅스 시스템에서는 내부적으로 이제 한글을 쓸 때에도 eucKR을 쓰지 않고 유니코드를 사용하고 있다. 유니코드로 한국어를 쓰려면 다음과 같이 로케일 설정이 바뀔 것이다.

$ export LANG=ko_KR.utf-8

참고로, 이런 로케일 설정은 요즘은 gdm이나 kdm과 같은 그래픽 화면 로그인 스크린에서 설정하는 것이 가장 편리하다. GNOME이나 KDE 로그인 스크린에서 언어를 선택하는 옵션이 그것이다.

마지막으로 지역화(localization, l10n)에 대해서도 잠깐 알아두자. 지역화의 줄임말인 l10n도 i18n과 같은 명명법을 따른 표기이다. 지역화는 국제화와는 달리 어떠한 프로그램이나 운영체제를 아예 특정 언어 전용으로 만드는 것을 의미한다. 리눅스 환경에서는 한텀과 같은 애플리케이션이 대표적인 예가 될 것이며, 윈도우의 경우는 한글 윈도우 98이 좋은 예가 된다. 지역화는 언어마다 각기 다른 애플리케이션이 만들어져야 하기 때문에 국제화보다 범용성이 떨어지는 편이며, 장기적인 개발비용을 줄이는 관점에서 국제화가 많이 권장되고 있다.

syntax highlighting
vim에서는 vi와는 달리 프로그램 소스 파일을 편집할 때는 여러 가지 색깔을 사용해서 소스코드 가독성을 높여주는 syntax highlighting 기능을 지원한다. syntax hightlighting 기능을 켜는 명령은 다음과 같다. 이 명령 역시 vimrc에 추가해 놓으면 편리하다.


:syntax on


참고로 언어에 따른 syntax hightlighting의 구체적인 설정은 /usr/share/vim 아래쪽의 설정 파일에서 다룬다. vim의 syntax highlighting 기능의 특징 중 하나는 화면 배경색의 밝기에 따라 syntax highlighting용 색상 구성을 다르게 쓸 수 있다는 점이다. 자신이 쓰고 있는 터미널의 배경색에 따라 다음 두 가지 중의 하나를 선택해 보자.


:set background=light 또는 :set background=dark


필자의 경우 흰색 배경의 한텀을 주로 쓰는 까닭에 light 옵션을 주로 쓰고 있다.

들여쓰기 설정
소스코드에서 탭 크기를 얼마로 잡을 것인지의 문제는 종종 게시판에서 플레임까지도 잘 번지는 주제이다. 소스코드의 탭 크기를 공백 8개로 할 것인가 아니면 탭 문자 하나로 둘 것인가, 만약 공백으로 처리한다면 4개로 할 것인가 8개로 할 것인가부터 시작해서 실로 다양한 스타일이 존재한다. 어느 경우든, 사용자의 입장에서는 탭 키를 한번 눌렀을 때 사용자가 원하는 쪽으로 들여쓰기가 알아서 된다면 무척 편리할 것이다.

우선, 자동으로 들여쓰기를 할 것인지 아닐 것인지를 설정해보자. 프로그램 소스코드를 짤 때는 블럭이 바뀌면 줄이 바뀔 때 마다 탭 키를 눌러 들여쓰기를 해야 하기 때문에 이 옵션을 켜 놓고 코딩을 하는 경우가 많다. 이 기능은 다른 vi에서도 작동한다.


:set autoindent 또는 :set ai


이 옵션을 해제하려면 다음과 같은 명령을 사용한다.


:set noautoindent 또는 :set noai


파일을 편집 중에 탭 키를 눌었을 때, 이것을 탭 문자 하나로 인식할 것인지, 혹은 디폴트 8개의 공백 문자로 인식할 것인지 설정하기 위해서는 expandtab 옵션을 설정한다.


:set expandtab 또는 :set et


이 때, vim에서 탭 문자 하나를 강제로 입력하려면 , tab의 조합을 누르면 된다. 는 컨트롤 문자를 vi에서 입력할 때 쓰는 명령키이다. expandtab 옵션을 해제하려면 앞의 경우와 마찬가지로 set noexpandtab 명령을 쓰면 될 것이다.

여기서(필자의 의견으로는) expandtab 옵션은 항상 켜놓고 탭 문자 하나를 여러 개의 공백 문자로 치환해서 사용하는 것이 좋다고 생각한다. 이렇게 작성한 소스코드는 어느 에디터에서 열어보더라도 똑같은 모습으로 들여쓰기가 잘 되어 있는 상태가 유지될 것이기 때문이다. 다만, 탭 문자의 들여쓰기를 공백 8개, 4개, 혹은 2개로 할 것인지에 대해서는 사람마다 취향이 다르고 프로젝트마다 스타일이 다를 수 있으며 그때 그때 상황에 맞추는 것이 좋다고 생각한다. tabstop 옵션은 vim에서 탭 문자 하나가 몇 개의 공백으로 보일 것인지를 설정할 때 사용한다.


:set tabstop=4     디폴트 값은 8이다. 약자로 set ts=4도 사용한다.


앞의 expandtab 옵션과 연계해서 생각해 보면, tabstop이 4로 설정되어 있고 noexpandtab 옵션이 설정되어 있다면 vim에서 탭 키는 탭 키를 누를 때마다 공백 4개의 폭으로 커서가 이동하고 내부적으로 탭 키는 누를 때마다 탭 문자 하나씩으로 인식하게 된다. 만약, 이렇게 편집한 파일을 다른 tabstop이 디폴트 8로 설정되어 있는 다른 vi나 기타 에디터에서 열어본다면 에디터가 탭 문자 하나를 8개의 공백 크기로 인식하는 바람에 소스코드가 완전히 다른 모습으로 보인다는 점을 고려해야 한다.

탭과 관련된 옵션으로 shiftwidth 옵션도 살펴볼 필요가 있다. shiftwidth 옵션은 들여쓰기를 할 때마다(탭 키를 누를 때마다가 아니라는 점에 유의하자) 몇 개의 공백 크기를 쓸 것인가를 설정해 준다. cindent 옵션과 같이 많이 쓰인다. tabstop과 gpt갈릴 수 있으므로 항상 tabstop 값과 같이 놓고 쓰면 편리하다.


:set shiftwidth=4 디폴트 값은 8이다. 약자로는 set sw=4를 쓴다.


C 소스코드를 작성할 때는 C 문법 스타일을 맞추어 주는 cindent 옵션을 켜놓으면 편리하다.


:set cindent


탭에 관해서 얘기가 조금 복잡해진 감도 있지만 간단히 정리를 해 보면 이렇게 생각해 볼 수 있다. 우선, 탭 문자를 여러 개의 공백 문자로 치환할 것인지 혹은 탭 문자를 있는 그대로 하나로 쓸 것인지 결정하는 것이 중요하다. 그리고 일단 여러 개의 공백 문자를 쓰기로 결정했다면 tabstop 값과 shiftwidth 값을 일치시켜서 혼동을 없애는 편이 좋으며, 반대로 탭 문자를 그대로 사용하겠다면 다른 에디터와의 호환 여부를 고려할 필요가 있다. 필자가 쓰는 탭 관련 설정은 다음과 같다.


모든 탭을 공백 4개로 설정한다.
set tabstop=4
set shiftwidth=4
set expandtab

set autoindent


다중 윈도우 사용
원래 vi는 다중 윈도우를 연다든가, 여러 개의 파일을 동시에 편집하는 기능이 들어 있지 않았다. emacs가 에디터 내에서 에디터 이상의 기능을 수행할 수 있는 통합 환경이라면 vi는 심플한 유닉스의 초기 설계 철학을 닮은 에디터라고 볼 수 있다. 하지만 vim의 추가 기능 중 다중 윈도우나 복수 개의 파일 편집 기능은 상당히 편리하며 널리 쓰이고 있다.

다중 윈도우 기능은 요즘 아래아한글이나 MS 워드에서도 손쉽게 볼 수 있다. 마우스로 오른쪽 스크롤바 위쪽의 핸들을 아래로 주욱 잡아당기면 파일 하나에 화면이 2개 생기는 것을 볼 수 있다. vim에서는 화면을 나누기 위해서는 split 명령을 사용한다. vsplit 명령을 쓰면 화면을 세로로 나눌 수도 있다.


:split 줄여서 sp로 쓴다


이 상태에서 , w 키를 차례로 누르면 커서가 다른 화면으로 이동하게 된다. 다음에 j 키를 누르면 아래 화면으로 이동하게 되고, 다음에 k 키를 누르면 윗 화면으로 이동하게 된다(h, j, k, l 모두 사용 가능하다). 여기서 화면 하나를 닫기 위해서는 , c 명령키나 close 명령을 사용한다.


:close 줄이면 cl로 쓴다


여러 개의 파일을 동시에 편집
이제 화면을 둘로 나누면서 새로운 파일을 편집해 보자.


:new


new 명령을 내리면 같은 파일을 두 개의 윈도우에서 같이 편집하던 아까의 split 명령과는 달리, new 명령으로 열린 윈도우는 완전히 새로운 파일을 편집하게 됨을 볼 수 있다. :new 과 같이 파일명을 명시해 줄 수도 있다. 이제 vim에서 화면을 윈도우로 나누지 말고 복수 개의 파일을 편집하는 방법을 알아보자. vim에서는 여러 개의 파일을 편집하기 위해 다음과 같이 vim을 실행하는 것이 가능하다.


$ vi hello.c hello.h main.c


파일을 전환하기 위해서는 다음 명령을 사용한다. 다음과 같이 간단히 정리해 보았다.


이동 : next (:n) - previous (:prev)
저장 후 이동 : wnext (:wn) - wprevious (:wp)


현재 커서가 위치하고 있는 파일 정보와 다른 파일들의 리스트를 보기 위해서는 :args 명령을 사용한다. 현재 편집 중인 모든 파일을 저장하는 :wall 명령어도 자주 사용된다.

[bash 셸에서 vi 키 사용하기]  
대부분 리눅스 배포판에서 기본 셸로 쓰고 있는 bash는 기본적으로 emacs 스타일의 편집키를 지원한다. 하지만 bash에서는 vi 편집 모드도 지원한다.

아마도 대부분의 리눅스 사용자들은 셸을 쓰면서 조금 전에 입력한 명령어로 다시 돌아가기 위해 직관적으로 위쪽 화살표 키를 누르는 습관이 있을 것이다. 이렇게 셸에서 명령어 history 기능을 이용하는데 오른쪽으로 손을 뻗어야 하는 불편이 있는 위쪽 화살표 키 말고 다른 키를 쓸 수도 있다. 이것이 bash에서는 emacs 스타일의 편집키를 쓸 수도 있고 vi 스타일의 편집키를 쓸 수도 있도록 되어 있다. bash 역시 GNU 프로젝트의 영향이 큰 까닭에 아무래도 디폴트는 emacs 스타일로 맞추어져 있다. emacs에서 위쪽 화살표에 해당하는 키는 이다. 개인적인 편차가 있겠지만 필자의 경우는 위쪽 화살표 키에 손을 뻗기보다는 그냥 <ctrl+p>를 누르는 편이 훨씬 편리하고 손목에 부담을 적게 받는다. 이제 vi 모드로 bash를 써 보자. vi 모드를 켜는 명령은 다음과 같다. .bash_profile에 넣어두고 써도 된다.

$ set -o vi

혹은 /etc/inputrc나 .inputrc에 다음 설정을 사용해도 된다.

set editing-mode vi
set keymap vi

이후로는 셸 프롬프트에서 esc 키를 누르면 vi의 명령어 모드로 진입한 것처럼 vi 편집키가 작동한다. 이제 위쪽 화살표 대신에 k 키를 쓸 수 있게 된 것이다. 추가로 자주 쓰는 cw와 같은 명령어를 사용해 보자.

굳이 vi 모드로 bash를 쓰지 않더라도, bash의 기본 설정인 emacs 스타일의 편집키는 항상 사용하는 습관을 들여 보자. emacs에서 커서 상하좌우 이동키는 각각 <ctrl+p>, <ctrl+n>, <ctrl+f>, <ctrl+b>이다. 여기에 Home에 해당하는 <ctrl+a>와 end의 <ctrl+e>까지라도 알아두자. emacs 편집키 역시 타이핑을 할 때 손목의 피로도를 줄일 수 있을 뿐만 아니라 다른 프로그램, 특히 GNU 계열의 응용 프로그램에서 디폴트로 많이 쓰인다.

참고로 이렇게 하나의 유틸리티에서 쓰는 명령어를 다른 곳에서도 그대로 지원해서 좀 더 사용자가 새로운 프로그램을 쉽게 쓸 수 있게 해주는 방식이 유닉스에서는 특히 많이 보이는 편이다. 간단한 예로, 페이지 단위로 텍스트 파일을 출력시켜 주는 more 프로그램에서는 스페이스바를 누르면 다음 페이지로 넘어가게 되는데 유닉스 환경에서는 스페이스바를 누르면 다음 페이지로 넘어가는 프로그램들이 한둘이 아니다. 심지어는 윈도우의 대표 브라우저인 인터넷 익스플로러도 스페이스바를 누르면 다음 페이지로 넘어간다. 인터넷 익스플로러가 오래된 유닉스의 모자이크(Mosaic) 브라우저의 소스코드를 기반으로 하고 있기 때문이다. 모질라 브라우저 역시 스페이스바를 누르면 다음 페이지로 넘어간다.

이런 이유로 유닉스를 쓰면서 vi와 emacs의 편집키는 적어도 둘 중 하나는 외워두는 것이 상식이다. 이들 편집키는 vi나 emacs를 벗어난 환경에서도 많이 쓰이며, 실제 사용해보면 무척 편리하다.


자신에게 맞는 편집기를 선택하자
이번 호에서는 리눅스의 대표적인 편집기인 vim에 대해서 알아보았다. 실제, 여러 설문조사 결과를 보면 리눅스 환경에서는 emacs 사용자와 vi 사용자가 대략 50대 50의 비율을 나타내고 있다. emacs를 쓸 것인지 vi를 쓸 것인지는 사용자의 선택이다. emacs는 편집기 이상의 기능을 발휘하는 통합 환경인 반면 vi는 작으면서도 기능이 강력한 편집기로서의 특성을 보인다. 필자 개인적으로는 vi를 주로 사용하고 emacs는 잘 쓰지 않는 까닭에 이번 기사에서는 emacs를 다루지 않았지만, vi 대신에 emacs를 사용하는 것도 좋은 선택임을 강조해 보고 싶다.

다음 호에서는 오픈소스 개발에서 많이 쓰이는 diff, patch부터 시작해서 cvs의 사용법을 리뷰하고 최근의 오픈소스 환경에서 중요하게 부상하고 있는 경향을 몇 가지 추가해 보기로 하겠다. @

 

손정우

2004/11/09