2011년 2월 19일 토요일

[Vim] CTags를 이용한 코드 탐색에 관하여

Vim으로 코딩을 하면서 ctags를 쓰지 않는 프로그래머는 개인적으로 '괴팍'하다고 생각한다. 그도 그럴게 너무 편하니까.

... Vim에서 태그를 잘 쓰고 계시다면 거의 하단 '본론' 부분으로 패스하시길 ...

모르는 이를 위해 단순히 설명하자면, ctags는 소스 코드의 Symbol을 정리하는 유틸리티이고, Vim에서는 ctags로 생성한 tags를 이용해 파일 탐색을 해 주는 기능이 있다. 단순히 말해서 '함수 몸뚱아리 찾기' 등등...
ctags -R .
이 명령 하나로 현재 및 하위 디렉토리의 모든 소스파일을 검색해서 tags라는 데이터베이스 파일을 생성한다.

혹시나 ctags가 없는 윈도우 유저는 Exuberant CTAGS를 다운받아서 쓰면 된다.

http://ctags.sourceforge.net/

설치법을 물어보는 분이 계실까봐 미리 언급하는데, ctagsXX.zip 파일을 받아서 압축을 풀어서 ctags.exe파일을 하나 찾아보자. 그 파일을 C:\Windows 나 C:\WinNT 밑에 복사하거나 아니면 적당한 디렉토리에 넣고 PATH를 잡아주자. 나머지 파일들은 소스이니 지워도 무관계.

(윈도우 디렉토리에 복사하는 건 기본적으로 PATH가 잡혀 있는 디렉토리라 편하게 설치가 가능하기 때문일 뿐 다른 의도가 있는 건 아니다 -_-)

다음, Vim에서 tags파일이 있는 곳을 지정해주자. 설정파일(~/.vimrc)을 열어서 아래 설정을 추가한 후 Vim을 띄워보자.
set tags=./tags,tags
현재 디렉토리에 tags파일이 있다고 가정한 설정이다. 태그 파일을 생성한 곳을 적당히 입력해 주는 편이 좋다.

(혹시나 해서 언급하지만, Windows 사용자의 경우 별 다른 설정을 하지 않았다면 Vim이 설치된 디렉토리의 _vimrc 파일이 바로 기본 설정파일이다.)

이제 Vim에서 특정 파일을 열고 Ctrl-] 를 누르면 해당 심볼을 검색해서 이동하거나 심볼리스트가 표시되는 것을 볼 수 있을 것이다. 반대로 Ctrl-t를 누르면 방금 전의 파일로 되돌아가게된다.

나는 다음 설정을 추가로 사용한다.
nnoremap <F11> <C-]>
nnoremap <F12> <C-t>
F11키로 검색하고 F12키로 되돌아오기. 단순한게 좋다.

자 이제 본론으로. (사족이 왜 이렇게 길어졌을까 -_-)

사용자에 따라 호불호가 갈리겠지만, 이 태그 데이터베이스인 tags 파일은 사실 여러 곳에 분포시킬 수도 있고 한 군데에 모아둘수도 있다.

예를 들어 특정 SDK디렉토리에도 tags를 만들고 자신의 프로젝트에 tags를 만들어도 되겠지만 이 둘을 하나의 tags로 관리하는 것도 가능하다. (이를 위해선 find 등을 써서 파일목록을 만들고 ctags로 파싱하는 등의 일련의 스크립트를 만들 필요성이 있다)

하지만 난 여러 프로젝트와 여러 SDK를 사용하는 입장에서 하나의 파일로 tags를 유지하는건 굉장히 낭패다. 겹치는 심볼이 있다면 불편하기도 할테고, 하나의 tags를 유지할거라면 소스가 바뀌어서 새로 만들 때 엄청 오래 걸릴 수도 있다.)

그리고 여러 프로젝트이기 때문에 tags를 특정 디렉토리에 몰아두기 같은 피곤한 일(설정 파일에 tags 위치를 표시해 주는 일)은 귀찮다.

그래서 이런 식의 설정을 이용한다.
set tags=./tags,tags
set tags+=../tags
set tags+=../../tags
...
set tags+=../../../../../../tags
set tags+=(특정 SDK의 tags 경로)
...
중간에 생략된 부분이 있지만 이해되리라 생각한다. 바로 현재 디렉토리, 혹은 그 상위, 혹은 그 상위의 상위...등등에 tags 파일이 있다고 설정하는 방식이다. 물론 특정 SDK의 심볼도 태그리스트에 포함시킨다.

만약 tags파일이 상위에 없다면 오류가 나겠네? 안난다. 정말 다행이었다. (^ O ^)

이렇게 설정해서 프로젝트 디렉토리(혹은 그 하위 디렉토리)에서 vim을 사용한다면 언제든 자신의 tags를 자동으로 찾을 수 있다.

이게 진짜로 하고 싶었던 이야기. 한번 더 말하지만, 개인 기호와 취향의 문제이니 따라할 필요는 없다. -_-;;

댓글 1개 :

익명 :

대박 팁이네요~~ 감사합니다.