본문 바로가기
기타/프로그래밍 관련

ctags를 이용한 VI에서 Go to Definition

by WebHack 2009. 5. 27.
ctags를 이용하면, 사용자 정의 함수가 나왔을때, 함수가 정의되어 있는 쏘스파일로 바로 점프할수 있으며, 또한 바로 원래의 쏘스파일로 되돌아올수 있다. 이렇게 함으로써 쏘스분석에 드는 시간을 상당히 줄일수 있다.

이번 문서에는 사용자가 vi 를 사용하고 있다는 가정하에 ctags 의 사용법을 설명하도록 하겠다.

ctags는 공개 소프트웨어로 쉽게 얻을수 있을것이다. 리눅스의 경우 웬만한 배포판은 기본으로 포함되어 있으니, 바로 사용하면 된다. 만약 설치되어 있지 않다면 http://ctags.sourceforge.net 를 방문해보도록 한다.

사용방법은 간단하다. 분석하고자 하는 소스가 있는 디렉토리에서 ctags 명령을 실행시켜주면 된다.
# ctags * 
위에서 ctags 는 현재 디렉토리에 있는 모든 파일에 대해서 tags 정보를 작성하도록 했는데, 현재 디렉토리 뿐만 아니라 모든 하위디렉토리에 대해서 tags 정보를 작성하고자 한다면 "-R" 옵션을 사용하면 된다.
# ctags -R 
ctags 명령을 실행시키고 나면, ctags를 실행한 디렉토리에 tags 란 파일이 생길것이다. 여기에 각 함수가 어느파일에 설치되어 있는지에 대한 정보가 들어 있고, vi를 실행 시키면 tags 파일을 참조하여 해당 함수가 정의되어 있는 파일로 자동으로 이동하게 된다.

tags 파일은 아래와 같이 구성되어 있다.
hello  hello.c   /^void hello(void)$/;"    f 
각필드는 "tab" 으로 구분된다.
  1. 첫번째 필드는 함수이름
  2. 두번째 필드는 함수가 정의된 파일의 이름
  3. 세번째 필드는 해당 파일에서 vi가 함수명을 찾아가도록 하기위한 정규표현식 이다.
  4. 네번째 필드는 해당 함수의 타입이다. "f" 라면 일반 C 함수라는 뜻이며, "c" 는 클래스에 선언된 멤버함수, "d" 는 define 된 값이란 뜻이다.

이제 vi 로 분석하고자 하는 쏘스파일을 열어보자. 분석하는 중에 hello() 라는 알수없는 함수가 나와서 이 함수의 원형이 있는곳으로 이동하고 싶을 때는 hello() 함수에 커서를 위치시키고 Ctrl + ] 를 누르면 된다. 그러면 곧바로 hello() 함수의 원형으로 이동하게 된다. hello() 함수에 대한 분석이 끝나서, 원래 분석하던 쏘스 파일로 돌아오고 싶다면 Ctrl + t키를 누르면 된다.

vi에서 사용되는 ctags 관련 커맨드를 정리해 보았다.
Tag Command 설명
Ctrl+] 함수가 정의된 파일로 이동
Ctrl+t 이동하기 전 단계의 위치로 이동
:tselect <function-name> 같은 이름의 function-name이 여러개 일때, 목록을 보여준다. 번호를 이용해서 선택할 수 있다
:tnext 여러개의 함수이름이 존재할 때, 다음 함수를 선택한다.
:tprevious 이전 함수를 선택한다.
:tfirst 가장 처음에 찾았던 함수를 선택한다.
:tlast 가장 마지막 함수를 선택한다.

Vim 을 시작하라. 원한다면 C 이름으로 (보기: 'vim -t main' 또는 'vi -t main') 시작할 수 있으며, 그러면 그 이름이 정의된 곳으로 바로 갈 수 있다.

이상으로 ctags 와 vi 를 이용한 쏘쓰 분석에 대해서 알아보았다. emacs 용으로는 etags 를 사용하는데, 이에 관한 내용은 나중에 기회가 되면, 설명하도록 하겠다.