본문 바로가기

TroubleShooting/Etc

ctags 사용법(하위디렉토리 검색)

728x90
vim 으로 소스에 선언된 함수나 변수를 확인하기 위해 ctags 를 많이 사용합니다.
보통 하위 디렉토리까지 확인하기 위해 "-R" 옵션을 줍니다. 그런데, 하위 디렉토리에서 참조한 함수에서 다시 그 디렉토리에 존재하는 함수를 다시 찾을때(ctrl+']') 찾지 못하는 경우가 있습니다. 

예를 들어, 현재 디렉토리에 a.c 가 존재하고, a.c 에 func_a() 를 호출합니다. func_a() 는 b 디렉토리의 c.c 에 존재합니다. b 디렉토리의 c.c 에서는 func_b() 를 호출합니다.
# ls
a.c b/

# more a.c
main()
{
    func_a();
}

# ls b
b.c c.c

# more b/b.c
func_b()
{
    int b;
}

# more b/c.c
func_a()
{
    func_b();
}

# ctags -R *

# vim a.c

func_a() 를 찾으면(ctrl+']'),  b/c.c 를 보입니다. 여기서 다시 func_b() 를 찾으면(ctrl+']') 를 찾으면 "cstag: 태그를 찾을 수 없습니다" 라는 에러메시지를 냅니다.

이때 사용된, tags 설정은(.vimrc) 아래와 같습니다.
set tags=./tags,../tags,../../tags,../../../tags,../../../../tags

tags 파일을 열어보면 다음과 같은 내용으로 되어 있습니다.
aa_func aa.c       /^aa_func()$/;"   f
func_a   b/c.c     /^func_a()$/;"     f
func_b   b/b.c     /^func_b()$/;"     f
main     a.c         /^main()$/;"       f

tags 파일만 보면 될꺼 같은데, 태그를 찾을 수 없다는 에러가 나옵니다. 고심끝에 .vimrc 의 tags 설정을 다음과 같이 바꿨더니 제대로 동작하네요.
set tags=./tags,tags,../tags,../../tags,../../../tags,../../../../tags

아니면, b 디렉토리에서 ctags 를 한번 더 실행해서 b/tags 를 생성시켜도 제대로 동작합니다.