Emacs 용 태그 : etags, ebrowse, cscope, GNU Global 및 활기 넘치는 ctags 간의 관계


102

저는 C ++ 프로젝트에서 작업하고 있으며 Alex Ott의 CEDET 가이드 및 StackOverflow의 태그에 대한 기타 스레드를 살펴 봤지만 Emacs가 자동 완성, 정의 조회, 소스 탐색을 용이하게하기 위해 이러한 다른 태그 시스템과 인터페이스하는 방법에 대해 여전히 혼란 스럽습니다. 코드베이스 또는 문서 문자열 미리보기.

  1. 사이 (예 : 기능의 측면에서)의 차이 란 etags, ebrowse, exuberant ctags, cscope, GNU GlobalGTags? Emacs 에서 사용하려면 어떻게해야 합니까?

  2. 태그를 사용하여 기호를 탐색 / 자동 완성하려면 의미 체계 / 상원 의원 (CEDET)이 필요합니까?

  3. 시맨틱은 이러한 다른 태그 유틸리티 위에 무엇을 가져다 줄까요? 이러한 도구와 어떻게 상호 작용합니까?


2
트렁크로 판단 GTags하면 연결 한 프로젝트가 완전히 죽었습니다. 누군가에 대해 이야기하고 있다면 gtags아마도 GNU Global을 언급하고있을 것입니다.
Gordon Gustafson

답변:


71

최근에 여기에서 읽은 것처럼 좋은 질문이므로 차이점에 대해 자세히 설명하겠습니다.

포인트 1 :

etags그리고 ctags언어의 파일 이러한 항목을 빠르고 쉽게 텍스트 편집기 나 다른 유틸리티에 의해 위치가 될 수 있습니다 소스 파일에있는 객체 (태그 / 태그 일명) 모두 인덱스를 생성합니다. 태그는 색인 항목을 사용할 수있는 언어 개체 (또는 해당 개체에 대해 만든 색인 항목)를 나타냅니다. ctags에 의해 생성 된 태그는 메타 데이터 측면에서 더 풍부하지만 Emacs는 어쨌든 추가 데이터를 해석 할 수 없으므로 어느 정도 동일하게 간주해야합니다 (주된 이점은 ctags더 많은 언어를 지원한다는 것입니다). 태그 파일의 주요 용도는 클래스 / 메서드 / 함수 / 상수 / 기타 선언 / 정의를 찾는 것입니다.

cscope(적어도 C / C ++ 및 Java에 관한 한) 훨씬 더 강력한 짐승입니다. 다소 동일한 원칙 (유용한 메타 데이터 파일 생성)으로 작동하지만 기호에 대한 모든 참조 찾기, 함수가 호출되는 위치 확인 등과 같은 멋진 작업을 수행 할 수 있습니다 (정의도 찾을 수 있음). .

그것을 요 ​​약하기:

ctags하나를 사용하면 기호 선언 / 정의로 이동할 수 있습니다 (일부에서는 단방향 조회라고도 함 ). ctags많은 언어에 유용한 범용 도구입니다.

반면 (프로젝트 페이지에 언급 된대로) 다음을 수행 cscope할 수 있습니다.

  • 기호 선언으로 이동
  • 기호에 대한 모든 참조의 선택 가능한 목록 표시
  • 전역 정의 검색
  • 함수에 의해 호출되는 함수
  • 함수를 호출하는 함수
  • 텍스트 문자열 검색
  • 정규식 패턴 검색
  • 파일 찾기
  • 파일을 포함한 모든 파일 찾기

내가 많이 사용합니다 내가 C / C ++ 프로젝트를 다룰 때,이 시점에서 누구에게도 놀라운 일이 아닙니다 cscope와 거의 신경 ctags. 다른 언어를 다룰 때 상황은 분명히 반전 될 것입니다.

포인트 2.

지능적인 자동 완성 기능을 사용하려면 진정한 소스 코드 파서 (예 : 의미 체계) 가 필요합니다 . 그렇지 않으면 응용 프로그램의 개체 유형 (예 :) 및 호출 할 수있는 메서드를 알 수 없습니다. 다양한 소스를 기반으로 자동 완성을 할 수 있지만 최상의 결과를 얻으려면 궁극적으로 파서가 필요합니다. 구문 강조 표시도 마찬가지입니다. 현재 Emacs 주요 모드에서 구문 강조 표시는 단순히 정규 표현식을 기반으로하며 매우 취약하고 오류가 발생하기 쉽습니다. 바라건대 Emacs 23.2 (이전에는 외부 패키지 였음)에 의미 체계를 포함 시키면 더 많은 용도를 볼 수 있습니다 (예를 들어 버퍼 소스 코드를 분석하여 적절하게 강조 표시하는 등).

Emacs 24.1 의미 체계는 Emacs 완성 프레임 워크에서 사용할 수 있기 때문에. 이를 테스트하는 가장 쉬운 방법은 C 소스 코드 파일을 열고 입력 M-TAB하거나 C-M-i의미 체계가 자동으로 완료되는지 확인하는 것입니다. 의미 체계가 기본적으로 활성화되지 않은 언어의 경우 선택한 주 모드 후크에 다음 줄을 추가 할 수 있습니다.

(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)

포인트 3.

semantic은 진정한 코드 인식 (현재 지원하는 몇 가지 언어에 대해)을 제공하고 IDE와 Emacs 간의 격차를 좁 힙니다. 정말 같은 도구와 인터페이스하지 않습니다 etags하고 cscope, 그러나 당신이 함께 사용할 수 없다는 것을 의미하는 것은 아니다.

내 설명이 의미가 있고 유용하기를 바랍니다.

추신 : 나는 global및에 익숙하지 ebrowse않지만 기억이 나에게 도움이된다면 그들은 etag를 사용했습니다.


1
이것은 훌륭합니다. 감사! cscopeEmacs에서 어떻게 사용할 수 있는지 아십니까 ? 여기서xcscope.el EmacsWiki 에 대해 읽었 지만 파일에 대한 링크를 찾을 수 없습니다. 또한 Emacs와 함께 가져 오기 위해 어떤 파일을 사용 합니까? .elcscope
Amelio Vazquez-Reina

1
xcscope.el에 위치 cscope/contrib/xcscope/(배포 패키지이 존재). 그게 제가 사용하는 것입니다.
Bozhidar Batsov

한 가지 더 질문 : semantic과 (와) 어떻게 비교 cscope됩니까? 소스 코드를 탐색하는 측면에서 의미 체계가 제공 cscope하지 않는 기능을 제공 합니까? 둘 다 사용합니까?
Amelio Vazquez-Reina

4
나는 GNU Global이 etags, btw를 사용한다고 생각하지 않습니다. IIRC는 (플랫 텍스트 파일을 스캔하는 대신) '적절한'데이터베이스를 유지 관리하고 쿼리하며, 이는 쿼리 및 (특히) 태그 업데이트 모두에서 많은 성능 이점을 제공합니다.
phils

@BozhidarBatsov 당신이 말했을 때 For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>. 그 코드 조각은 정확히 무엇을합니까?
Amelio Vazquez-Reina

45

1에 몇 가지 설명을 추가해 보겠습니다.

뭔데?

  • Etags는 Emacs의 태그 파일 인 'TAGS'파일을 생성하는 명령입니다. emacs 패키지의 일부인 etags.el과 함께 파일을 사용할 수 있습니다.
  • Ctags는 vi의 태그 파일 인 'tags'파일을 생성하는 명령입니다. 이제 Exuberant Ctags는 -e 옵션으로 'TAGS'파일을 생성 할 수 있으며 41 개의 프로그래밍 언어를 지원합니다.
  • Cscope는 C 언어 용 올인원 소스 코드 검색 도구입니다. 고유 한 CUI (문자 사용자 인터페이스) 및 태그 데이터베이스 (cscope.in.out, cscope.out, cscope.po.out)가 있습니다. cscope 패키지의 일부인 xcscope.el을 사용하여 Emacs에서 cscope를 사용할 수 있습니다.
  • GNU GLOBAL은 소스 코드 태깅 시스템입니다. 위의 도구와 비슷하지만 어떤 편집기와도 종속적이며 명령 줄을 제외하고는 사용자 인터페이스가 없다는 점에서 다릅니다. Gtags는 GLOBAL (GTAGS, GRTAGS, GPATH)에 대한 태그 파일을 생성하는 명령입니다. GLOBAL 패키지의 일부인 gtags.el을 사용하여 emacs에서 GLOBAL을 사용할 수 있습니다. 이 외에도 많은 elisp 라이브러리가 있습니다 (xgtags.el, ggtags.el, anything-gtags.el, helm-gtags.el 등).

비교

  • Ctag와 etag는 정의 만 처리합니다. Cscope와 GNU GLOBAL은 정의뿐만 아니라 참조도 다룹니다.
  • Ctag 및 etag는 플랫 텍스트 태그 파일을 사용합니다. Cscope와 GNU GLOBAL은 키-값 태그 데이터베이스를 사용합니다.
  • Cscope 및 GNU GLOBAL에는 검색 엔진과 같은 grep 및 태그 파일의 증분 업데이트 기능이 있습니다.

콤비네이션

Ctags를 GLOBAL의 플러그인 파서로 사용하여 Exuberant Ctags의 풍부한 언어 지원과 GNU GLOBAL의 데이터베이스 기능을 결합 할 수 있습니다.

다음을 시도해보십시오 : (각각 GLOBAL-6.0, Exuberant Ctags-5.5 이상 필요)

GNU GLOBAL 구축 :

$ ./configure --with-exuberant-ctags=/usr/local/bin/ctags
$ sudo make install

용법:

$ export GTAGSCONF=/usr/local/share/gtags/gtags.conf
$ export GTAGSLABEL=ctags
$ gtags                     # invokes Exuberant Ctags internally
$ emacs -f gtags-mode       # load gtags.el

(그러나 ctag는 참조를 처리하지 않기 때문에이 방법으로 참조를 처리 할 수 ​​없습니다.)

cscope를 GNU GLOBAL의 클라이언트로 사용할 수도 있습니다. GLOBAL 패키지에는 cscope의 포트 인 'gtags-cscope'라는 명령이 포함되어 있습니다. 즉, cscope가 아닌 검색 엔진으로 GLOBAL을 사용하는 것을 제외하고는 cscope 자체입니다.

$ gtags-cscope          # this is GLOBAL version of cscope

조합을 통해 41 개 언어에 대해 cscope를 사용할 수 있습니다.

행운을 빕니다!


1
Debian 및 Ubuntu와 같은 파생 제품 사용자의 경우 : GNU GLOBAL 웹 페이지는 이러한 Linux 배포판과 함께 제공되는 .deb 패키지가 날짜가 지났으므로 사용해서는 안된다고 경고합니다. 제 경우에는 GLOBAL이 버전 5.7.1이었고 gtags.el, ggtags.el 또는 helm-gtags.el이 Emacs 24에서 제대로 작동하도록 할 수 없었습니다. Exuberant Ctags ( 나는 5.8을 사용했다) 치료를 받았다. (훌륭한 포인터 @shigio에 감사드립니다).
Rob

9

TAGS 파일에는 정의가 포함되어 있습니다.

TAGS파일은 함수와 클래스가 정의되는 곳의 목록이 포함되어 있습니다. 일반적으로 프로젝트의 루트에 위치하며 다음과 같습니다.

^L
configure,3945
as_fn_success () { as_fn_return 0; }^?as_fn_success^A180,5465
as_fn_failure () { as_fn_return 1; }^?as_fn_failure^A181,5502
as_fn_ret_success () { return 0; }^?as_fn_ret_success^A182,5539
as_fn_ret_failure () { return 1; }^?as_fn_ret_failure^A183,5574

이것은 Emacs가 정의를 찾을 수 있도록합니다. 기본 탐색은에 내장되어 find-tag있지만 etags-select일치하는 항목이 여러 개인 경우 더 멋진 UI를 제공합니다.

코드 완성을 위해 TAGS 파일을 사용할 수도 있습니다. 예를 들어 회사의 etags 백엔드는 TAGS 파일을 사용합니다 .

TAGS 파일은 다양한 도구로 빌드 할 수 있습니다.

ctags(이전에는 'universal ctags'또는 'exuberant ctags'로 알려짐) TAGS 파일을 생성하고 가장 광범위한 언어를 지원할 수 있습니다. github에서 적극적으로 유지 관리됩니다.

이 개라는 태그 파일을 생성 프로그램과 이맥스 배 etagsctags. Emacs ctagsetags범용 ctag와 동일한 CLI 인터페이스를 사용합니다. 혼동을 피하기 위해 많은 배포판에서 이러한 프로그램의 이름을 변경합니다 (예 : ctags.emacs24Debian).

TAGS 파일 생성을위한 언어 별 도구 (예 : jsctagshasktags.

기타 파일 형식

ebrowseEmacs와 함께 제공되는 C 프로그램입니다. C / C ++ 코드를 인덱싱하고 BROWSE파일을 생성 합니다. ebrowse.el은 일반적인 찾기 정의와 완성을 제공합니다. BROWSE코드베이스에 정의 된 클래스 / 함수에 대한 개요를 얻기 위해 Emacs에서 직접 파일 을 열 수도 있습니다 .

GNU Global 에는 GTAGS, GRTAGSGPATH파일 로 구성된 자체 데이터베이스 형식이 있습니다 . gtagsC / C ++ 코드를 구문 분석 하는 명령을 사용하여 이러한 파일을 생성 할 수 있습니다 . 다른 언어의 경우 GNU Global은 범용 ctag에 의해 생성 된 파일을 읽을 수 있습니다.

GNU Global은 또한 '이 기호가 언급 된 위치'와 같은보다 정교한 질문을 할 수있는 CLI 인터페이스를 제공합니다. Emacs 패키지 gtags.el과 함께 제공되지만 ggtags.el 은 GNU 글로벌 데이터베이스에 액세스하는데도 널리 사용됩니다.

Cscope 는 정신적으로 GNU Global과 유사합니다. C / C ++를 자체 데이터베이스 형식으로 구문 분석합니다. 또한 '이 기능의 모든 발신자 / 수신자 찾기'와 같은 질문에 답할 수 있습니다.

global과 cscope를 비교하는이 HN 토론을 참조하십시오 .

클라이언트 / 서버 프로젝트

rtags 는 영구 서버를 사용하여 C / C ++를 구문 분석하고 인덱싱합니다. clang 파서를 사용하므로 C ++를 정말 잘 처리합니다. 서버를 쿼리하기 위해 Emacs 패키지와 함께 제공됩니다.

google-gtags 는 큰 TAGS 파일이 서버에 저장되는 프로젝트였습니다. 서버를 쿼리하면 검색과 관련된 TAGS 파일의 하위 집합이 제공됩니다.

시맨틱 (CEDET)

Semantic은 C / C ++ 용 파서를 포함하는 내장 Emacs 패키지이므로 정의도 찾을 수 있습니다. 또한 TAGS 파일, csope 데이터베이스 및 기타 소스에서 데이터를 가져올 수 있습니다. CEDET에는이 데이터를 사용하는 IDE 스타일 기능도 포함되어 있습니다 (예 : 클래스 계층 구조의 UML 다이어그램 생성).


7

[ shigio 의 답변 업데이트 ]

질문의 1 부에 몇 가지 설명을 추가하려고합니다.

뭔데?

  1. EtagsEmacsTAGS태그 파일 형식 인 파일을 생성합니다 . etags.elEmacs의 일부인 Etags 파일을 사용할 수 있습니다 .
  2. CtagstagsVi의 기본 태그 파일 형식 인 파일을 생성 할 수있는 모든 것에 대한 일반적인 용어입니다 . Universal Ctag ( UCtags이전의 Exuberant Ctag)는 -e옵션으로 Etag를 생성 할 수도 있습니다.
  3. cscope의는 자신의 태그 데이터베이스 (와, (C ++ 및 Java에 대한 낮은 지원) C에 대한 모든 기능을 하나의 소스 코드 탐색 도구 cscope.in.out, cscope.out, cscope.po.out)와 TUI . Cscope 지원은 Vim에 내장되어 있습니다. xcscope.el 패키지를 사용하여 Emacs에서 Cscope를 사용할 수 있습니다 . 도 있습니다 cscope를 기반의 GUI는 .
  4. GNU GLOBAL (일명 Gtags)은 태그 파일도 생성한다는 점에서 또 다른 소스 코드 태깅 시스템 (큰 차이점이 있습니다. 다음 섹션 참조)입니다.

비교

  • Ctag와 Etag는 정의 (예 : 변수 및 함수) 만 처리합니다. Cscope 및 Gtags도 참조를 처리합니다.
  • Ctags 및 Etags 태그 파일은 플랫 입니다. Cscope 및 Gtags 태그 파일은 (예 : 증분 업데이트) 더 강력한 키-값 데이터베이스 입니다.
  • Cscope와 Gtag는 grep유사한 검색 엔진을 가지고 있습니다.
  • Ctags에는 더 많은 언어 및 데이터 형식에 대한 지원이 내장되어 있습니다. Universal Ctags 파서 의 현재 저장소 목록을 참조하세요 . UCtags는 또한 자체 파서를 개발하는 방법을 문서화했습니다 .
  • Cscope와 Gtag는 편집자 독립적입니다.
  • Gtags는 자체 사용자 인터페이스를 제공하지 않지만 현재 (2016 년 10 월) 명령 줄 (CLI), Emacs 및 친척, Vi 및 친척, less(호출기), Doxygen 및 모든 웹 브라우저에서 사용할 수 있습니다.
  • Gtags는 gtags.elGLOBAL 패키지를 통해 제공 하지만 xgtags.el, ggtags.el, anything-gtags.el, helm-gtags.el을 포함한 다른 많은 elisp 확장도 있습니다.

콤비네이션

Ctags를 GLOBAL 플러그인 파서 로 사용하여 Universal Ctags의 풍부한 언어 지원을 Gtags의 데이터베이스 기능 및 수많은 확장과 결합 할 수 있습니다 .

# build GNU GLOBAL
./configure --with-exuberant-ctags=/usr/local/bin/ctags
sudo make install

# use it
export GTAGSCONF=/usr/local/share/gtags/gtags.conf
export GTAGSLABEL=ctags
gtags                     # invokes Universal Ctags internally
emacs -f gtags-mode       # load gtags.el

Ctag를 Gtag의 파서로 사용하는 경우 Gtag가 제공하는 참조 (예 : 변수 사용, 함수 호출)를 처리하는 기능을 잃게됩니다. 기본적으로 Gtags의 참조 추적을 Ctag의 기본 제공 언어 지원과 교환합니다.

Cscope를 Gtags의 클라이언트로 사용할 수도 있습니다 gtags-cscope..

행운을 빕니다!


필자는 "Ctag를 Gtag의 파서로 사용하는 경우 Gtag가 제공하는 참조 (예 : 변수 사용, 함수 호출)를 처리하는 기능을 잃게됩니다. 기본적으로 Gtags의 참조 추적을 Ctags의 더 큰 내장 언어 지원. " Emacs와 함께 제공되는 이전 ctag에 해당합니까, 아니면 Universal Ctag에도 여전히 해당합니까? 또한 "유니버설 Ctag의 풍부한 언어 결합"을 읽었지만 --with-exuberant-ctags=...2019 년 현재 사용하는 쉘 스 니펫 에는 --with-universal-ctags옵션이 있습니다. 후자로 변경해야합니까?
bgoodr

3

실제로 확인하지는 않았지만 CEDET 매뉴얼 ( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ) 에 따르면 :

semantic은 CScope를 데이터베이스 검색의 백엔드로 사용할 수 있습니다. 활성화하려면 다음을 사용하십시오.

 (semanticdb-enable-cscope-databases)

이렇게하면 모든 C 및 C ++ 버퍼에 대해 cscope를 사용할 수 있습니다.

CScope는 기존 의미 데이터베이스 검색이 모든 파일을 구문 분석하지 않았을 때 백업으로 프로젝트 전체 검색에 사용됩니다.


1
이것은 함께 제공되는 바닐라 CEDET 2.0을 사용하여 Emacs 24.3.1에서 작동하지 않는 것 같습니다 (semanticdb-enable-cscope-databases 메소드 없음).
Rob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.