출처 : JOINC(www.joinc.com)
1. 소개
이 문서는 Vim을 이용해서 C 프로그래밍을 하려는 개발자를 대상으로 작성되었다. Vim 초보자를 위한 문서이긴 하지만, 경험자에게도 많은 도움을 줄 수 있으리라 생각된다.
2. 이동
2.1. 문자단위 이동
C 소스파일을 열어서, W, e, b를 입력해 보기 바란다. vim은 각 토큰을 구분해서 빠르게 다음 토큰으로 이동 가능하도록 도와준다. 이 키들을 이용하면 좀더 빠르게 토큰사이의 이동이 가능하다.
... if((NULL == x) && y > z) ... |
e는 각 토큰의 마지막으로 이동한다는 걸 제외하고는 w와 동일하다.
b는 뒤로 이동한다는 걸 제외하고 w와 동일하다.
2.2. {,},[[,]] 키
{와 }는 문단단위의 이동을 위해서 사용한다. 문단은 비슷한 하나의 사물을 기술하는 여러 문장의 모음으로, 일반적으로 문서의 최소단위로 사용되며, 문서를 좀더 쉽게 읽을 수 있도록 도와준다.
/* first C-statment */....../* Next Set of C-statment */...... |
C 코드 역시, 가독성을 높이기 위해서 아래의 예처럼 문단단위로 작성되는 경우가 많다. 논리적으로 비슷한 코드라인들을 하나의 문단으로 작성한다.(Vim은 한줄의 공백을 만나면 그다음 문단으로 생각한다)
void functin1(){ /* Declarations */ int x; char y; double z; /* some code */ x = 1; y = 'a'; z = 1.2; /* some more code */ x++; y++; z++;} |
[[와 ]]는 {사이를 이동할 때 사용한다.
void foo(){ // ....}void bar(){ // ....} |
이외에도 [], ][와 같은 조합도 사용할 수 있다. 이들 키는 }를 탐색하는데 사용한다. []는 이전의 } ][는 다음 {로 바로 이동할 수 있다.
이들 키는 사용하기에 직관적이지 않다라는 단점을 가진다. 그래서 요즘 배포되는 vim은 좀더 직관적으로 사용가능하도록 다음과 같은 맵핑을 제공한다.
:map [[ ?{ |
2.3. % 키
if ((x==y) && ((z-=a) || (y>x))) |
3. C파일에서 임의의 위치로 이동하기
3.1. ctags
Tag는 코드에서 사용되는 논리적인 요소들의 집합을 정렬한 것으로, Tag를 이용하면 C코드를 쉽게 분석할 수 있다. C파일에 사용되는 함수들의 북마크 라고 이해할 수 있다. Tag는 특히, 함수의 원형을 보고자 할때, 유용하게 사용할 수 있다.
foo(){ ... bar(); ...}bar(){ ...} |
tag를 이용하면 CTRL-]와 CTRL-T 두개의 키로 함수원형으로의 이동을 간단하게 끝낼 수 있다.
tag기능은 물론 그냥 쓸 수는 없다. 모든 함수에 대해서 북마크 자료가 만들어져 있어야만 사용가능하기 때문이다. ctags명령을 사용하면 C코드들에 포함된 함수의 북마크를 생성할 수 있다.
# ctags *.c |
# ctags -R *.c |
3.2. Mark
mark는 tag와 비슷한면이있다. 다른 점이라면 자신이 위치할 지점을 능동적으로 mark(표시)할 수 있고, 동일한 파일 내에서만 이동이 가능하다는 점이다.
자주 참고해야 하는 함수나 코드라인은 표시를 해두고 필요할 때 마다가 한번의 단축키로 찾아갈 수 있도록 한다면 매우 편리할 것이다. vim은 사용자가 표시한 라인을 기억하고 있다가 요청할 경우 바로 이동시켜주는 Mark 기능을 제공한다. 역시 일종의 북마크 기능이라고 볼 수 있을 것이다.
100 foo()101 {102 int x,y;103 x = 0;104 y = 1;105 x++;106 y++;107 if (x != y)108 x=y;109 y=x110 } |
표시에 사용되는 이름은 단일 문자여야 한다. 그리고 대문자와 소문자를 구분하므로, 하나의 파일에서 약 50개 정도의 위치를 기억시킬 수 있다. 그러나 인간의 기억의 한계로 보통은 2-3개 정도의 위치만 기억시키고 사용하며, 이정도로도 충분히 유용하게 사용할 수 있다.
3.3. gd 키
아래와 같은 코드를 편집한다고 가정해보자.
struct X x;void foo(){ struct Y y; struct Z z; ... /* Lost of lines later */ x.bar(); y.bar(); z.bar();} |
4. 자동완성
void A_Very_Long_Function_Name(){ ...}short A_Very_Long_Variable_Name;void Another_Function(){ ... A_Very_Long_Function_Name(); ... } |
A_Very 까지 입력하고 나서 CTRL-P를 입력해보기 바란다. 그러면 A_Very로 시작되는 함수/변수명 등을 검색할 수 있다. 위의 예제 코드는 2개의 A_Very로 시작하는 단어(함수와 변수)를 가지고 있는데, CTRL-P를 연속으로 누르면, A_Very로 시작되는 다음 단어를 검색하게 된다. 원하는 단어를 찾을 때까지 CTRL-P를 눌러주기만 하면 된다. 자동완성 기능은 vim의 입력모드에서 사용할 수 있다.
CTRL-P와 비슷하게 사용할 수 있는 CTRL-N키도 있다. 뒤로 검색한다는 걸 제외 하고는 CTRL-P와 동일하게 사용할 수 있다.
자동완성 기능은 기본적으로 현재 열린파일에서만 작동을 한다. 하지만 많은 경우 자동완성이 필요한 변수/클래스명 등은 외부파일에 따로 선언되는 경우가 많을 것이다. 이런경우 :set dictionary=file명령을 이용해서 자동완성을 위해 참조할 파일을 지정할 수 있다.
다음과 같이 C나 C++등에서 자주사용되는 키워드, 함수, 클래스이름 등을 정리해서 따로 사전파일로 만들어 두면, 좀더 편리한 개발환경을 만들 수 있을 것이다.
# cat .cdictbreakcasecontinuedefaultdefinedodoubleelseenumfloatgotoifndefifdefswitchtypedef |
5. 포맷 자동 화
5.1. 라인 폭 조절
코딩을 하다보면 줄이 길어져서 화면의 폭을 넘어가는 경우가 생기는데, 이렇게 되면 코드의 가독성이 떨어지게 된다. 다음과 같은 명령으로 폭을 조정할 수 있다.
:set textwidth=80 |
5.2. 자동 들여쓰기
프로그램을 작성할 때, 코드의 가독성을 위해서 들여쓰기를 하게 된다. 아래와 같은 명령으로 자동으로 들여쓰기가 되도록 설정할 수 있다.
:set cindent |
5.3. 주석완성
Vim은 자동주석완성 기능을 제공한다. 당신이 주석을 만들기를 원한다면 보통 세부분으로 이루어지게 될 것이다. 첫부분은 주석을 시작하는 부분이 될것이고, 중간부분은 주석 내용이 들어가고 마지막 부분은 주석을 닫는 부분이 될것이다.
/* * 주석입니다. */ |
:set comments=sl:/*,mb:*,elx:*/ |
이번에는 주석의 형식을 약간 달리해보도록 하겠다.
/*** 2006년 2월 19일 ** 만 든 이 : yundream** 만든이유 : 심심해서*/ |
:set comments=sl:/*,mb:**,elx:* |
6. 여러개의 파일을 편집하기
코딩을 하다보면 여러개의 파일을 열어서 작업해야 하는 경우가 생긴다. 보통은 헤더파일과 소스파일을 함께 열어서 헤더파일을 참조하면서 소스파일을 코딩한다. vim에서는 다음과 같은 명령으로 여러개의 파일을 한번에 열 수 있다.
# vim file1 file2 ... |
:n |
:e# |
:split를 이용해서 새로 생성된 화면에는 현재열려진 파일의 편집상태가 된다. 열려진 화면에서 :e file2를 이용하면, file2의 편집상태로 만들 수 있다. CTRL-W키를 이용하면 화면들 사이를 이동할 수 있다.
7. 빠른수정
Vim을 이용해서 프로그래밍을 할 때의 문제점은 편집-컴파일-편집의 무한순환을 반복해야 하는 경우가 발생한다는 점이다. 일반적으로는 편집을 마치고, 편집창을 빠져나온 다음 컴파일을 하고, 컴파일 결과를 보고 다시 Vim 화면으로 가서 필요한 코드를 수정하거나 하는 식이다. IDE와 같이 편집/컴파일 과정이 통합되지 않은 까닭에, 오류메시지를 별도의 창에 가져다 붙인다음에, 코딩을 해야 하는 등의 문제도 발생한다.
전용 에디터인 Vim으로는 IDE와 같은 완전한 통합환경을 구축하기는 힘들지만 그럭저럭 좀더 편하게 사용가능 하도록 할 수는 있다.
가장 단순한 방법은 컴파일 과정에서 발생한 에러를 파일로 저장한다음 그 정보를 토대로 해당 에러 위치로 편리한 이동을 하는 방법이다.
1 #include |
# gcc uname.c 2> uname.err |
# vim -q uname.err |
만약 Makefile을 통해서, 코드가 관리되고 있다면, vim 화면에서 바로 컴파일 하고, 에러를 확인할 수 있다. 에러의 이동은 :cn, :cN으로 하면 된다.
:make |
:set makeprg=gcc uname.c |
여기에서 제시한 방법을 이용하면, 훨씬 퀘적한 개발환경을 만들 수 있을 것이다.
'[OS] > Embedded&Linux' 카테고리의 다른 글
pmap을 이용한 memory leak 검사 (0) | 2006.12.19 |
---|---|
GDB를 이용한 디버깅 (0) | 2006.12.11 |
Windows Services for UNIX (0) | 2006.07.21 |
syslog daemon programming (3) | 2006.06.11 |
리눅스 시스템 모니터링과 문제 찾기 (0) | 2006.05.12 |