나는 주로 vim / gvim을 편집기로 사용 하고 커널 소스를 탐색하기 위해 lxr (Linux Cross Reference) 과 cscope 또는 ctags 의 조합을 사용하려고 합니다. 그러나 나는 cscope 또는 ctags를 사용하지 않았으며 vim을 기본 편집기로 사용하는 것을 고려하여 왜 하나를 선택할 수 있는지 듣고 싶습니다.
답변
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는 크고 알려지지 않은 코드베이스를 유지해야하지만 더 많은 레그 작업이 필요한 경우 더 많은 기능을 제공합니다.
답변
몇 달 전 같은 상황에 있었어요
ctags의 정밀도 부족은 고통스럽고, 모든 매크로 관련 항목에 대해 cscope가 훨씬 더 좋습니다 (Linux 커널에는 매크로가 많이 있습니다).
사용법에 관해서는 실제로 간단합니다 … 커널의 루트에 cscope -R을 입력하면 걱정할 필요가 없습니다. (완전히 탐색하고 싶다면 완벽합니다 …)
그런 다음 키 바인딩은 모두 Ctrl- \를 기반으로합니다 (Ctrl에 알레르기가있는 경우 다시 매핑 할 수 있음). 주로 s와 g를 사용합니다.
커널을 개발하면서 완성 할 필요가 없었습니다 ….
어쨌든 cscope로 이동하면 훨씬 편리하고 정확합니다.
답변
흠 … 아마도 ctags 대신 etags를 사용해야합니다 …
cscope를 사용하면 콜 체인을 볼 수 있습니다. 즉 누가이 함수를 호출하고 어떤 함수를 호출합니까?
이것이 etags / ctags를 사용하여 수행 할 수 있는지 확실하지 않습니다 …
그것은 단지 하나의 특징입니다 … 특정 함수 정의가 포함 된 파일을 찾는 것은 어떻습니까? 이것은 당신이 cscope에서만 얻을 수 있습니다.
나는 cscope와 etags를 모두 사용 하는데 , 특히 Linux Kernel과 같은 큰 코드베이스로 작업 할 때 다른 것들에 좋습니다. 실제로 Linux Kernel / Xen으로 작업을 시작할 때 cscope 및 etag를 사용하기 시작했습니다.
LXR은 크지 않다. 왜냐하면 클릭, 네트워크 등을 거쳐야하는 반면, 커널 코드에서 cscope 및 tags 데이터베이스를 구축 할 수 있고 (lxr과 달리) 네트워크를 통해 갈 필요는 없다 .