본문 바로가기
리눅스

Ctags

by 다움위키 2023. 12. 19.

Ctags코드 이해를 돕기 위해 다양한 프로그래밍 언어의 소스 및 헤더 파일에서 찾은 이름의 색인 (또는 태그) 파일을 생성하는 프로그래밍 도구입니다. 언어에 따라, 함수, 변수, 클래스 구성원, 매크로 등이 인덱싱될 수 있습니다. 이들 태그는 텍스트 편집기, 코드 검색 엔진, 또는 기타 유틸리티에 의해 정의를 빠르고 쉽게 찾는 것을 허용합니다. 대안적으로, 언어 파일 집합에서 발견된 다양한 이름에 대한 정보를 사람이 읽을 수 있는 형식으로 나열하는 교차 참조 파일을 생성하는 출력 모드도 있습니다.

원래 CtagsBSD 유닉스 3.0에 도입되었고 Ken Arnold에 의해 작성되었고, Jim Kleckner에 의해 Fortran을 지원하고 Bill Joy에 의해 Pascal을 지원했습니다. 그것은 1992년 단일 유닉스 사양과 XPG4의 초기 릴리스의 일부입니다.

Editors that support ctags

Tag index files은 많은 다음을 포함하여 많은 소스 코드 편집기에 의해 지원됩니다:

Variants of ctags

ctags 프로그램의 몇 가지 다른 구현이 있습니다:

Etags

GNU Emacs는 같은 소스 코드에서 컴파일된 두 개의 ctag 유틸리티, etag와 ctag가 있습니다. Etags는 Emacs에 대해 태그 테이블 파일을 생성하지만, ctags 명령은 vi에 의해 이해될 수 있는 형식으로 유사한 테이블을 생성하기 위해 사용됩니다. 그것들은 서로 다른 명령줄 옵션 집합을 가집니다: ctags 명령에 의해 생성된 vi 스타일 태그 파일에 대해서만 의미가 있는 옵션에 대해, etags는 그것들을 인식하지 못하고 무시합니다.

Exuberant Ctags

2009년까지 Darren Hiebert에 의해 작성되고 유지 관리된 Exuberant Ctags는 처음에는 Vim과 함께 배포되었지만, Vim 6의 출시에서 별도의 프로젝트가 되었습니다. 그것은 Emacs와 etags 호환성에 대한 지원이 포함합니다.

Exuberant Ctags는 정규 표현식을 사용하여 더 많은 지원을 추가하기 위한 능력을 갖는 40개 이상의 프로그래밍 언어에 대한 지원을 포함합니다.

Universal Ctags

Universal Ctags는 Exuberant Ctags의 포크이며, 개발을 계속하는 것을 목표로 합니다. 몇 개의 파서가 언어를 더 잘 지원하기 위해 다시 작성되었습니다.

Language-specific

HasktagsHaskell 소스 파일에 대한 ctags 호환 태그 파일을 생성합니다. 그것은 Emacs etag 파일 생성 지원을 포함합니다.

jsctagsJavaScript에 대해 ctags-호환 코드 인덱싱 솔루션입니다. 그것은 JavaScript에 특화되어 있고 CommonJS 패키징 시스템을 사용합니다. 그것은 JavaScript 코드에 대해 Exuberant Ctags보다 성능이 뛰어나, 후자보다 더 많은 태그를 찾습니다.

Tags file formats

여러 태그 파일 형식이 있습니다. 그중 일부는 아래에 설명되어 있습니다. 다음에서, \x##는 십육진수 표현 ##으로 바이트를 나타냅니다. 모든 각 줄은 줄 바꿈 (LF, \n = \x0A)으로 끝납니다.

Ctags and descendants

원본 ctag와 Exuberant/Universal 후손은 유사한 파일 형식을 갖습니다:

Ctags

이것은 vi와 다양한 클론에서 사용되는 형식입니다. 태그 파일은 통상적으로 "tags"로 이름지어집니다.

태그 파일은 각 행의 형식이 다음과 같은 행 목록입니다:

{tagname}\t{tagfile}\t{tagaddress}

필드는 다음과 같이 지정됩니다:

  • {tagname} – 공백을 포함하지 않는 임의의 식별자.
  • \t – 정확하게 하나의 (\x0b) 문자이지만, 많은 버전의 vi는 임의의 양의 공백을 처리할 수 있습니다.
  • {tagfile} – 현재 디렉토리와 관련하여, {tagname}이 정의된 파일의 이름
  • {tagaddress} – 편집기를 태그 위치로 이동시키는 ex 모드 명령. vi의 POSIX 구현에 대해, 이것은 오직 검색 또는 행 번호일 수 있으며, 임의의 명령 실행에 대한 추가 보안을 제공합니다.

태그 파일은 태그 파일의 빠른 검색을 허용하는 {tagname} 필드에 정렬됩니다.

Extended Ctags

이것은 Vim의 Exuberant Ctags와 Universal Ctags에 의해 사용하는 형식입니다. 이들 프로그램은 원래 ctags 파일 형식 또는 이전 버전과의 호환성을 유지하려는 확장 형식을 생성할 수 있습니다.

확장된 태그 파일은 행의 목록이며, 각 행은 다음 형식입니다:

{tagname}\t{tagfile}\t{tagaddress}[;"\t{tagfield...}]

{tagaddress}를 포함하고 그것까지의 필드는 위의 ctags와 같습니다.

선택적 추가 필드는 대괄호 ("[...]")에 의해 표시되고 다음을 포함합니다:

  • ;" – 세미콜론 + 큰따옴표: vi 또는 ex에 대한 주석의 시작처럼 보이는 방식으로 {tagaddress}를 끝냅니다.
  • {tagfield} – 확장 필드: 자세한 내용에 대해 탭으로 구분된 "키:값" 쌍을 참조하십시오.

이 형식은 추가 데이터가 주석으로 해석되기 때문에 비-POSIX vi와 호환됩니다. 어쨌든, vi의 POSIX 구현은 이를 지원하도록 변경되어야 합니다.

Etags

이것은 Emacs etags에 의해 사용되는 형식입니다. 태그 파일은 통상적으로 "TAGS"로 이름지어집니다.

etags 파일은 여러 섹션–입력 소스 파일당 하나의 섹션–으로 구성됩니다. 섹션은 특수 목적으로 사용되는 인쇄할 수 없는 여러 ASCII 문자를 갖는 일반-텍스트입니다. 이들 문자는 아래에 괄호로 묶인 십육진수 코드로 표시됩니다.

섹션은 두 줄의 헤더로 시작합니다 (처음 두 바이트는 매직 넘버를 구성합니다):

\x0c
{src_file},{size_of_tag_definition_data_in_bytes}

헤더 다음에는 다음 형식의 태그 정의가 한 줄에 하나씩 정의됩니다:

{tag_definition_text}\x7f{tagname}\x01{line_number},{byte_offset}

{tagname}\x01는 태그의 이름이 태그 정의에서 텍스트로부터 추론될 수 있으면 생략될 수 있습니다.

Example

한 줄의 test.c 소스 코드가 주어지면:

#define CCC(x)

TAGS (etags) 파일은 다음과 같습니다:

\x0c
test.c,21
#define CCC(\x7fCCC\x011,0

태그 (ctags) 파일은 다음과 같습니다:

CCC(	test.c	1

또는 검색을 사용하여 보다 유연하게:

CCC(	test.c	/^#define CCC(/

External links