여러 C ++ 소스 파일 프로젝트에서 함수 선언 또는 정의로 이동할 수 있습니까?


15

여러 C ++ 소스 파일 프로젝트에서 함수 선언 또는 정의로 이동할 수 있습니까?

헤더 파일이 있다고 가정 해 보겠습니다 foo.hpp.

int bar();

그리고 소스 파일 foo.cpp:

#include "foo.hpp"
int bar() { return 42; }

주요 파일 main.cpp:

#include "foo.hpp"
int main() { bar(); return 0; }

vim이 함수 bar()에서 함수의 정의와 선언을 모두 찾을 수 있습니까 main?

답변:


15

무성한 ctags는 이것을 달성하는 가장 간단한 방법입니다. GNU / 리눅스 (예 : 우분투 또는 데비안)에서는

sudo apt-get install exuberant-ctags

(OSX "$ brew install ctags"이면 충분합니다. Windows의 경우 http://ctags.sourceforge.net/ 을 방문 하여 독립형 실행 파일을 다운로드하십시오)

그런 다음 프로젝트의 루트 폴더로 이동하여 실행하십시오.

ctags -R --exclude=.git .

그러면 전체 프로젝트를 스캔하고 ./tags 파일을 만들어 vim이 자동으로 키를 누를 때 기능으로 이동할 수있는 기능을 제공합니다. 즉:

Ctrl + ]

구현하고자하는 함수에 커서를 놓습니다. ctags로 코드를 탐색 할 수있는 다른 조합과 많은 명령 모드 기능이 있습니다 (예 : Ctrl+ t를 사용하여 이전 태그 스택 항목으로 이동). 보다:help 29.1개요를 .

참고 당신은 코드의 각 큰 변화를 다시 실행 ctags를해야하고 그것이 다시 인덱스 프로젝트를 할 수있다. 수동으로 수행하거나 vim에게 핫키 또는 쓰기로 수행하도록 지시 할 수 있습니다.

힌트 : ctags를 광범위하게 사용하는 경우 vim-taglist ( http://vim-taglist.sourceforge.net ) 플러그인도 살펴볼 가치가 있습니다. 해당 클래스 / 파일에 대한 모든 함수 목록이있는 IDE 스타일 개요를 제공합니다.


알아야 할 두 가지 : 범용 태그는 여러 가지면에서 무성한 태그를 대체했습니다. 또한 git이 태그를 동기화하도록하는 방법
D. Ben Knoble

4

지금까지 함수의 선언이나 정의를 찾는 문제에 대한 두 가지 해결책을 말할 수 있습니다. 다른 태그 기반 솔루션이 있다는 것을 알고 있지만 사용하지 않을 때 다른 사람들이 귀하에게 알려줄 것입니다.

더 많은 트렌디 한 첫 번째 : YouCompleteMe는:GoToDefinition와를:GoToDeclaration 쌍의 명령이 있습니다.

내가 사용하는 것 (10 년의 긴 습관을 바꾸는 것은 어렵습니다). 내 lh-tags 플러그인에는 ctags 데이터베이스를 생성하고 점진적으로 업데이트하는 방법이 있습니다. 또한 CTRL+W Meta+Down커서 아래에있는 것 (/ 선택된 것)과 일치하는 모든 선언 및 정의를 표시 하는 방법 ( )을 제공합니다. 이 솔루션은 ctags에 의존하기 때문에 커서 아래의 식별자가 실제로 관련되어있는 과부하를 알 수 없습니다. 다른 ctags 기반 솔루션은이 주제에 대해 나쁘거나 좋을 것입니다. 그러나 YCM이 여기에서 훨씬 나을 것입니다.

Discl .:보다 인체 공학적인 대안으로 lh-tag를 구현했습니다 :tselect.

(실제로 세 번째 해결책을 기억합니다 .clang-indexer 포크 와 관련 vim 플러그인 을 시작했을 것입니다.하지만 YCM을 사용하면이 솔루션을 잊어 버렸습니다)

편집 : 2019 년 현재 가장 효율적인 솔루션은 LSP 서버에 의존 합니다 . COC + ccls 를 사용하여 색인을 생성하고 더 많은 작업을 수행하고 있습니다. 시간이 많이 걸리지 않거나 최근 버전의 clang 및 ccls를 설치할 수없는 프로젝트에 대해 COC를 구성하기에 너무 게으른 경우 태그 기반 솔루션으로 돌아갑니다.


1
입력 주셔서 감사합니다, 각 솔루션을 테스트합니다. YouCompleteMe를 테스트했으며 GoToDeclaration여러 소스 파일 에서만 작동합니다. 여기에 대한 문서에서 인용입니다 GoToDefinition: For C-family languages this only works ... when the definition of the symbol is in the current translation unit.. 또한 명령은 :YcmCompleter GoTo*입니다.
Allan Hasegawa

나는이 줄을 놓쳤다. 이는 clang_indexer가 여전히 유용 할 수 있음을 의미합니다. 다른 솔루션은 설치하기가 약간 까다로울 수 있습니다. 필요한 경우 나에게 이메일을 보내 주저하지 마십시오.
Luc Hermitte

3

몇 가지 대안이 있습니다. 첫 번째는 ctags입니다. 고급 인덱서가 필요한 경우 더 cscope나은 대안입니다. 예를 들어 주어진 함수의 모든 호출자 를 나열 할 수 있습니다 . 이 도구는 코드를 제대로 이해하지 않고 코드를 색인화합니다 (주어진 기호의 의미를 알기 위해 간단한 문법 정의가 있습니다). 문법을 확장하는 것도 비교적 쉽습니다. 그만큼taglist플러그인은 다음이 있어야합니다 그것은 taglist 결과 표시에 인덱서 문법을 확장하는 것이 가능하다.

구문 검사와 같은 인덱서보다 더 많은 것이 필요하다면 YouCompleteMe아마도 갈 길입니다. 그것은 위에 구축되어 llvm있으므로 적절한 파서가 있습니다. 이를 통해 코드 구문과 의미 를 확인할 수 있습니다 .

그런 다음 도메인 특정 언어 또는 임베디드 코드가있는 코드로 작업하면 종종 파일을 통해 greping됩니다. 대안은 Ack이 작업을 도와주는 perl 스크립트입니다.


0

나는 그것이 당신에게 필요한 것이라고 생각합니다. Vim은 기본적으로 ctags와 통합되어 있으며 함수 정의 및 선언으로 쉽게 이동할 수 있습니다.

이 기사를 살펴보십시오 http://andrew.stwrt.ca/posts/vim-ctags


링크 된 게시물의 요약을 추가하십시오. 연결이 끊어지면 연결 전용 답변이 쓸모 없게됩니다.
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.