cscope 또는 ctags 왜 다른 것을 선택합니까? [닫은]


131

나는 주로 vim / gvim을 편집기로 사용 하고 커널 소스를 탐색하기 위해 lxr (Linux Cross Reference)cscope 또는 ctags 의 조합을 사용하려고 합니다. 그러나 나는 cscope 또는 ctags를 사용하지 않았으며 vim을 기본 편집기로 사용하는 것을 고려하여 왜 하나를 선택할 수 있는지 듣고 싶습니다.

답변:


157

ctags는 두 가지 기능을 지원합니다. 함수 호출에서 해당 정의로 건너 뛸 수 있으며 전 방향 완료입니다. 첫 번째는 메소드를 호출 할 때 해당 메소드가 정의되거나 구현 된 위치에 도달 g]하거나 CTRL-]점프 함을 의미합니다. 두 번째 기능 수단는 것을 당신은 입력 할 때 foo.foo->, 그리고 푸 구조 인 경우 다음 필드 완료와 팝업 메뉴가 표시됩니다.

cscope는 또한 첫 번째 기능을 사용 set cscopetag하지만 마지막 기능은 아닙니다. 그러나 cscope는 또한 함수가 호출되는 곳으로 이동할 수있는 기능을 추가합니다.

따라서 코드베이스를 뛰어 넘을 때 ctags는 함수가 구현되는 위치로만 안내하지만 cscope는 함수가 호출되는 위치를 보여줄 수 있습니다.

왜 다른 것을 선택 하시겠습니까? 글쎄, 나는 둘 다 사용한다. ctags는 설정하기 쉽고 실행 속도가 빠르며 한 가지 방법으로 만 점프하는 경우 줄 수를 줄입니다. 당신은 그냥 실행 :!ctags -R .하고 g]작동 할 수 있습니다 . 또한 그 전능 한 것을 가능하게합니다.

Cscope는 더 크고 알려지지 않은 코드 기반에 적합합니다. cscope가 파싱 할 파일 이름 목록을 포함하는 파일이 필요하기 때문에 설정이 어려워집니다. 또한 vim에는 기본적으로 키 바인딩이 설정되어 있지 않으므로 :cscope blah blah수동으로 실행 해야합니다.

주먹 문제를 해결하기 위해 cscope_gen.sh다음과 같은 bash 스크립트 가 있습니다.

#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp'  \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

이것은 내가 관심있는 코드를 검색하고 cscope.files 목록을 만들고 데이터베이스를 만듭니다. 이렇게하면 모든 설정 단계를 기억할 필요없이 ":! cscope_gen.sh"를 실행할 수 있습니다.

이 스 니펫을 사용하여 cscope 검색을 ctrl-space x 2에 매핑하면 cscope의 다른 하위 요소를 완화 할 수 있습니다.

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

유사한 바인딩을 설정하는 이 cscope_maps.vim 플러그인이 있습니다 . 모든 옵션의 의미를 기억할 수 없으므로 Ctrl-Space를 고수하는 경향이 있습니다.

결론적으로 ctags는 설정하기가 쉬우 며 대부분 다른 작업을 수행하지 않고 작동하므로 옴니-컴플리트에도 필수적입니다. cscope는 크고 알려지지 않은 코드베이스를 유지해야하지만 더 많은 레그 작업이 필요한 경우 더 많은 기능을 제공합니다.


2
태그를 더 정확하게 만드는 방법이 있습니까? 나는 make tags커널 루트 디렉토리에서 뛰었고 뛰어 다니며 대부분의 시간이 잘못되었습니다. 나는 ctags가 c 전처리기에 문제가 있다는 것을 읽었지만 ctags가 lxr에서 사용된다는 것을 고려할 때 분명히 할 수있는 일이 있어야합니다.
Robert S. Barnes

2
깊은 매크로 부두가 있다면, ctags를 가능성이 실패합니다 :-( 내가 가지의 측면에 덜 의존하는 C ++ 물건 (즉, 자신의 문제가 있지만 ...)을 위해 주로 사용
richq

12
cscope를 통해 and 명령을 먼저 검색 한 다음 태그 를 설정하려면 set cscopetag( cst):tagCTRL-]
Hasturkun

1
또한 "ctags -L cscope.files"를 사용하면 재귀 검색시 ctags가 상당히 느려 태그 생성 속도가 크게 향상됩니다.
Aaron H.

1
@ RobertS.Barnes는 일종의 솔루션을 사용 g C-]하고 있습니다. vim은 이름과 일치하는 태그 목록을 보여줍니다. 여전히 수동으로 찾고있는 적절한 정의를 찾아야합니다.
Hubert Kario

15

몇 달 전 같은 상황에 있었어요

ctags의 정밀도 부족은 고통스럽고, 모든 매크로 관련 항목에 대해 cscope가 훨씬 더 좋습니다 (Linux 커널에는 매크로가 많이 있습니다).

사용법에 관해서는 실제로 간단합니다 ... 커널의 루트에 cscope -R을 입력하면 걱정할 필요가 없습니다. (완전히 탐색하고 싶다면 완벽합니다 ...)

그런 다음 키 바인딩은 모두 Ctrl- \를 기반으로합니다 (Ctrl에 알레르기가있는 경우 다시 매핑 할 수 있음). 주로 s와 g를 사용합니다.

커널을 개발하면서 완성 할 필요가 없었습니다 ....

어쨌든 cscope로 이동하면 훨씬 편리하고 정확합니다.


4
<< 커널의 루트에 cscope -R을 입력하면됩니다. .... 커널 아래에 "make cscope"를 입력하는 것이 좋습니다.
kumar

4

흠 ... 아마도 ctags 대신 etags를 사용해야합니다 ...

cscope를 사용하면 콜 체인을 볼 수 있습니다. 즉 누가이 함수를 호출하고 어떤 함수를 호출합니까?

이것이 etags / ctags를 사용하여 수행 할 수 있는지 확실하지 않습니다 ...

그것은 단지 하나의 특징입니다 ... 특정 함수 정의가 포함 된 파일을 찾는 것은 어떻습니까? 이것은 당신이 cscope에서만 얻을 수 있습니다.

나는 cscope와 etags를 모두 사용 하는데 , 특히 Linux Kernel과 같은 큰 코드베이스로 작업 할 때 다른 것들에 좋습니다. 실제로 Linux Kernel / Xen으로 작업을 시작할 때 cscope 및 etag를 사용하기 시작했습니다.

LXR은 크지 않다. 왜냐하면 클릭, 네트워크 등을 거쳐야하는 반면, 커널 코드에서 cscope 및 tags 데이터베이스를 구축 할 수 있고 (lxr과 달리) 네트워크를 통해 갈 필요는 없다 .


emacs만을위한 전자 태그가 아닙니까? 나는 g / vim을 독점적으로 사용합니다.
Robert S. Barnes

네, 맞아요. 매뉴얼 페이지에서 : etags 프로그램은 emacs (1)에 의해 이해되는 형식으로 태그 테이블 파일을 작성하는 데 사용됩니다. ctags 프로그램은 vi (1)에 의해 이해되는 형식으로 유사한 테이블을 작성하는 데 사용됩니다.
rmk

1
내가 믿는 etags와 ctags에는 두 가지 맛이 있습니다. 하나는 이맥스이고 다른 하나는 무성한 ctags입니다. 첫 번째는 emacs 용으로 처음 작성되었지만 vi에도 사용할 수 있습니다. 두 번째는 vi 용으로 처음 작성되었지만 emacs에도 사용할 수 있습니다. 나는 emacs 사용자인데도 두 번째 태그 (충분한 ctag)를 사용하기가 더 쉽다는 것을 알게되었습니다. exuberant-ctags 패키지를 설치하면 etags / ctags 바이너리에 대한 링크가 변경되고 다른 바이너리를 가리 킵니다.
ustun

1

글로벌 gtag 사용을 제안하십시오. vim 플러그인 gen_tags 를 사용하여 gtags를 vim과 통합 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.