2011년 5월 4일 수요일

[Emacs] etags

Emacs에서 배포되는 etags는 ctags에서 지원되는 recursive가 없다. 그래서 etags 단독으로 태그(TAGS)를 만드는 건 포기해야 할 것 같다. 물론 ctags를 이용해서 TAGS를 생성할 수도 있지만, ctags에 비해 etags가 objective-c 도 지원해 주는 등 제약이 덜 한 것 같다.

일단 기본적으로 다음 처럼 find와 연계해서 TAGS를 생성할 수 있다.
find . -name "*.py" -print | xargs etags -
기본적으로 find를 이용해서 python파일들에서 TAGS를 생성하는 예제. 결국 etags 뒤에 파일 리스트를 넘겨주면 알아서 TAGS를 생성해 낸다는 이야기다.

일반적인 C식의 경우
find . -name "*.[ch]" -print | xargs etags -
처럼 .c파일과 .h파일을 찾아서 하는 식으로 많이 쓴다.

find에서 지원하는 정규표현식은 그룹이 지원 안되는 것 같다. 그래서 C의 경우와는 다른 확장자수가 틀린 경우는 좀 귀찮게 해야 할 것 같다.
find . -iname "*.cpp" -o -iname "*.h" -print | xargs etags -
cpp와 h 파일을 (확장자 대소문자를 무시하고) 한 번에 검색해서 TAGS를 생성하는 예제. 다른 방법도 있겠지만...

좀 더 복잡한 다수의 파일에서 태그를 생성해야 한다면 전용을 파일리스트를 생성하는 스크립트를 만들어서 써야 될 것 같다.

댓글 2개 :

Wonjun Lee :

안녕하세요. 이맥스 관련 질문이 생겨 댓글남깁니다.
현재 C/C++ 개발환경 구축중인데 ggtag 라는걸 사람들이 많이 추천하길래 이리저리 찾아다녀 봤는데 감이 잘 안오더군요.
태그라는 것이 구체적으로 무엇인지에 대해서요.
위 패키지도 비슷한걸 사용하는데 구체적으로 태그라는게 무엇인가요

Renn Seo :

ctags라던가 etags 라던가 (ggtag는 잘 모르겠지만) 등등은 태그 데이터베이스 생성 및 검색 도구입니다.
직관적으로 말해서 ctags나 etags 같은 도구는
- 코드에서 사용되는 모든 심볼을 데이터베이스화(인덱싱) 하고
- 이 데이터베이스에서 특정 심볼을 검색하는 기능을 제공합니다.

예를 들어 코드를 분석하는 도중 특정 함수의 내용이 궁금하면 이 태그 툴을 이용해 해당 함수의 구현부 위치로 점프 할 수 있습니다. (주로 커널 분석하시는 분들은 커널 소스를 통채로 태깅해 놓고 소스를 분석하시지요.)

위 글에 쓰인 내용은 이 태그 데이터베이스를 생성 할 때 모든 .c, .h 파일의 내용을 인덱싱 하도록 하려는 의도입니다. 물론 vim이나 emacs를 안쓰는 분에겐 쓸모가 없지요. 왜냐하면 이클립스나 Xcode 같은 IDE에선 기본적으로 제공되는 기능이니깐요.