ctag란 소스파일에 있는 항목들을 쉽고 빠르게 찾을 수 있도록 tag(or index)파일을 생성하는 명령어로 Ken Arnold에 의해 작성, BSD UNIX에서 처음 소개 되었다. ctag는 vi와 emacs 같은 텍스트 에디터뿐 아니라 다른 utility들(AcroEdit, BBEdit 8+, JED, JOE, Nedit, UltraEdit, etc)과도 연동 사용 가능하다.

ctags의 특징은 다음과 같다. 1)다양한 프로그래밍 언어(Assembler, basic, C/C++, C#, Cobol, Lisp, matlab, java, perl, etc.)를 지원한다는 것이다.  2)C/C++ 언어에서 사용되는 모든 형식(Class name, macro definitions, function definitions, variables, etc.)의 tag 생성이 가능하다. 3) 전처리기 #if를 사용한 조건적 구조를 포함, 복잡한 선택에 대한 해결 방법으로 조건적 경로 선택 알고리즘과 fall-back 알고리즘을 사용한다. 4)사용자 정의 언어를 지원한다. 5)Emacs 스타일의 tag 파일 출력을 지원한다. 6)소스파일에서 선택된 개체의 목록을 출력할 수 있다. 7)다양한 OS(UNIX, MSDOS, Windows 95/98/NT, OS/2, QNX, VMS, etc.) 상에서 컴파일 가능하다.

다음은 tags의 종류와 특징을 설명한다. 1)Etags는 Emacs와 함께 제공되는 ctags utility이지만 Vi 스타일로 제작된 tag 파일과의 호환성이 떨어짐. 2)Exuberant Ctags는 초기엔 Vim과 함께 배포되었으나, Vim 6부터 별도의 프로젝트로 분리하였다. Emacs에 대한 호환성 지원 포함하고 40개 이상의 프로그래밍 언어 지원한다.
3)Hasktags는 Haskell 언어를 위한 ctags utility로 Emacs etags 를 지원한다. 4)Jsctags는 JavaScript를 위한 ctags utility로 JavaScript에서는 Exuberant Ctags보다 뛰어난 성능을 가진다.

다음으로 tags의 file foramt에 대해 알아보자. 1)ctags는 vi와 다양한 클론들에서 사용하며, ‘tags’라는 파일을 생성한다. {tagname}<tab>{tagfile}<tab>{tagaddress}와 같이 사용하며 {tagname}은 공백을 포함하지 않은 식별자, <tab>은  구분을 위한 하나의 tab 문자. {tagfile}은 {tagname}이 정의된 위치. {tagaddress}는 EX 모드에서 명령 사용시에 쓰여질 에디터 상의 tag 위치를 나타낸다. 2)Exuberant ctags는 Vim에서 사용되는 형식으로, 오리지널 ctags 형식과 확장 형식에서 모두 호환 가능하다.{tagname}<tab>{tagfile}<tab>{tagaddress}[;”<tab>{tagfield}…]로 사용한다. 3)etags 파일은 입력 소스파일 마다 하나의 섹션으로 나눠진 multiple 섹션으로  구성하고 각 섹션은 특별한 목적을 가진 몇 개의 non-ascii 문자들과 일반적인 텍스트로 구성한다. 또한 섹션은 두 개의 라인 헤더로 시작된다. <x0c>{src_file}, {size_of_tag_definition_data_in_bytes}, {tag_definition_text}<x7f>{tagname}<x01>{linu_number},{byte_offset}

macs에서 etags를 사용해보자. 1)‘M-.’(‘find-tag’)는 정의된 tag file을 이용하여 tag를 찾는다. 프로젝트 내에 같은 이름으로 여러 개의 태그가 있다면 ‘C-u M-.’을 이용하여 다음 tag로 이동한다. 2)‘M-*’(‘pop-tag-mark’)는 뒤로 점프한다. ‘M-x tags-search’는 regexp(regular expression)를 이용한 탐색이다(shell 상에 사용되는 grep 명령과 비슷). 3)‘M-x tags-query-replace’ 는 입력한 query를 통해 검색된 tag를 교체한다. 4) ‘M-x tags-apropos’는 입력한 regexp가 포함된 모든 tag 목록을 출력한다. 5)‘M-x list-tags’는 소스파일 내에 정의된 모든 tag 목록을 출력한다.

Practice(etags)
실습내용은 다음과 같다. 먼저 etags를 이용한 tag file를 생성한다. 이때 기본 값으로 TAGS 라는 이름의 파일 생성. -f <tagfile name> 옵션은 파일 이름을 지정 가능하게 하고, -a 옵션은 기존의 tag file에 append한다. -V 옵션은은 tagfile의 생성과정을 출력하여 보여주고, -R옵션은 recursive하게 하위폴더를 포함하여 tag file을 생성한다. Emacs를 이용해 생성된 tags 내용을 확인해보자

다음으로 생성된 tags에 진입해보자. ‘M-.’ 명령을이용하여 찾고자 하는 tag name을 입력할 수 있다. Tag file을 지정할 수 있으며 default은 TAGS이다. Etag 명령 사용시 tab을 이용하면 매치되는 명령어 목록을 볼 수 있다.

마지막으로 regexp를 이용한 tag 검색을 해보자. 먼저 검색어를 입력하면 매칭되는 tag 목록이 출력된다. Source file 내의 tag 목록을 출력할 수 있다.