C ++에서 지능적인 자동 완성을 얻는 방법?


43

Emacs는 자동 완성 기능이없는 다른 IDE와 경쟁 할 수 없습니다. 자동 완성 기능을 사용하면보다 효율적인 프로그래머가됩니다. 자동 완성 모드 확장을 알고 있지만 C ++에서는 작동하지 않습니다.

자동 완성

C ++를위한 스마트하고 효율적인 자동 완성을 어떻게 달성 할 수 있습니까?


이 질문은 원래 Malabarba 에 의해 Area 51 제안 : C ++에서 지능적인 자동 완성을 얻는 방법?


1
이 질문을 조금 확장하는 것이 좋을 것입니다. 그것은 많은 잠재적 가치를 가지고 있지만, 지금 문제는 제목 일뿐입니다.
Malabarba

아이러니 모드현재가 는 길인 것 같습니다.
Sevki

답변:


45

면책 조항 : 나는 아이러니 모드의 저자입니다

회사 아이러니

스마트 자동 완성을 원한다면 company-irony 와 함께 irony-mode 를 권할 수 있습니다 .

  • MELPA 덕분에 아이러니 모드를 쉽게 설치할있습니다
  • 완성은 매우 정확성능 꽤 괜찮은 덕분에 libclang
  • 회사 아이러니를 사용하면 비동기 완료 백엔드가 있으며 완료하는 데 시간이 걸리면 방해가되지 않습니다.
  • 회사 아이러니 는 오버로드 된 함수를 지원하며 Yasnippet을 설치 한 경우 함수 인수는 채우기위한 자리 표시 자로 삽입됩니다
  • 프로젝트에서 Doxygen을 사용 하는 경우 완료 후보에 대한 간략한 문서 가 미니 버퍼에 표시됩니다 (스크린 샷 참조).
  • 유닉스 계열 시스템 (리눅스, OS X)에 아이러니 모드 서버를 쉽게 설치할 수 있습니다. 반면에 Windows는 약간의 조정이 필요하지만 위키에 문서화되어 있습니다.

아직 인용되지 않은 또 다른 도구는 emacs-ycmd 입니다.


2
정말 고맙습니다! 내가 더 빨리 알기를 바란다irony-mode
Luke

@GuillaumePapin 아이러니를 작성해 주셔서 감사합니다! 사용 가능한 타이밍 벤치 마크가 있습니까? clang_codeCompleteAt구문 분석 된 TU (그러나 저장되지 않은 변경 사항)로 호출하는 데 3-5 초가 걸리는 것으로 나타났습니다 . 가 irony-mode이보다 빨리?
Pradhan

1
Irony는 libclang / clang_codeCompleteAt를 사용하므로 그보다 더 나은 시간을 얻지 못할 것입니다. 컨텍스트에 따라 3-5 초가 너무 클 수 있습니다 (예 : 전역 범위에서 완료하는 데 다른 범위보다 시간이 오래 걸림). 내가 최근에 한 몇 가지 타이밍을 살펴볼 수 있습니다 : github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008803


irony-mode와 emacs-ycmd의 역할은 어떻게 비교됩니까? 그들은 서로의 대안입니까? 둘 다 사용하는 것이 합리적입니까?
Praxeolitic

23

내 가이드를 확인하십시오 . C / C ++에서 자동 완성을위한 몇 가지 방법이 나열되어 있습니다.

이러한 옵션은 다음과 같습니다.

  • 아이러니 사용 . Clang을 사용하고 다른 솔루션과 비교하여 설정하기 쉽기 때문에 적극 권장됩니다.

  • Emacs의 내장 파서를 사용합니다. Semantic Emacs 파서에서 얻을 수있는 가장 좋은 자동 완성이지만 Linux 커널과 같은 대규모 프로젝트에서는 느릴 것입니다.

  • 사용 company-mode하여 패키지를 company-clang. Clang에서 경로를 자동으로 가져올 수 있지만 로컬 프로젝트에 대한 일부 구성을 수행해야하므로 시스템 포함 경로에 대한 코드 완성을 제공합니다.

  • company-mode와 함께 사용 company-gtags. GNU Global에서 생성 된 태그 데이터베이스를 완성으로 사용합니다. 이를 사용하여 프로젝트에 로컬로 완전한 코드를 제공 할 수 있습니다. 생성 된 데이터베이스 내부의 모든 것을 사용자에게 던지기 때문에 정확하게 지능적이지는 않습니다.

  • rtags실시간 분석을위한 서버를 제공하여 더 멀리 나아갑니다. 그러나 순수한 Elisp 솔루션과 비교하여 설정이 복잡합니다.


rtags 설정이 순수한 emacs lisp 솔루션보다 더 복잡하다는 데 동의하지 않습니다. Pure emacs lisp 솔루션은 일반적으로 cmake / build 파일을 고려하지 않으며 헤더 를 거의 찾을 수 없습니다 . Rtags는 비교하기가 매우 쉽습니다. 테스트 범위가 좋지 않은 프로젝트는 여전히 젊습니다.
baol

Tuhdo의 가이드에 추가 된 멋진 기능 : syamajala.github.io/c-ide.html
Victor

9

RTags + Company에서 큰 성공을 거두었습니다 .

RTag는 rdm코드 완성, 코드 탐색 및 리팩토링을 위해 clang을 사용 하는 별도의 데몬을 실행해야합니다. rdm또한 기호 데이터베이스로 기능하므로 자동 완성이 직접 호출하는 솔루션보다 훨씬 빠릅니다 clang_codeCompleteAt.

RDM는 번거 로움을 할 수 있습니다 귀하의 프로젝트를 컴파일 플래그의 정보를 필요로하지만 당신이에서 조언을 따르는 경우 RTags의 페이지와 심볼릭 링크 gcc-rtags-wrapper.shgcc, g++, ccc++RDM가 자동으로 재 컴파일에 새 컴파일 플래그와 함께 업데이트됩니다.


방금 아이러니 모드에서 rtag로 전환했습니다. 아이러니 모드는 지속적으로 고장 나서 약 15 분 정도 지나면 작동을 멈 춥니 다. Rtags는 지금까지 꽤 좋아 보였고 yasnippet과 깔끔하게 통합되었습니다.
nenchev

6

해결 방법 1 : 회사 모드 + 클랑

유일한 문제는 회사 모드에 프로젝트의 c / c ++ 헤더 파일을 검색 할 위치를 알려주는 것입니다.

cmake를 사용하는 경우 https://github.com/redguardtoo/cpputils-cmake 가 설정을 수행 하도록 할 수 있습니다 (힌트 : cpputils-cmake의 저자입니다).

또는

해결 방법 2 : 회사 모드 + GNU 글로벌

말할 것도없이, gnu global cli 툴을 사용하여 태그를 빌드 할 필요가 있습니다.


1

저는 cmake-ide 를 사용하여 rtags, flycheck, irony 및 company-clang을 구성했습니다.

이제 빌드 시스템 자주 사용하는 정적 분석 emacs 플러그인을 동시에 구성 할 수 있습니다 !

편집 : 회사 clang은 당신이 찾고있는 기능인 자동 완성 기능을 제공합니다. cmake-ide는 또한 flycheck 및 rtag를 구성 할 수 있으며, 이는 IDE와 유사한 기능을 추가합니다.


1
이것이 C ++ 자동 완성을 얻는 방법에 대한 질문에 어떻게 대답하는지 설명하십시오.
Drew

@Drew company-clang은 완성을 제공합니다
AnimatedRNG

답을 적어주세요. 고마워.
Drew

0

MX 시맨틱 모드

www.gnu.org/software/emacs/manual/html_node/semantic/Using-Semantic.html#Using-Semantic

&&

태그 테이블

검색 . -name "*. [chCH]"-print | etags-

www.gnu.org/software/emacs/manual/html_node/emacs/Tags.html

etags , ctags-이맥스에 대한 태그 파일 생성, vi

manpages.debian.org/cgi-bin/man.cgi?query=etags&apropos=0&sektion=0&manpath=Debian+8+jessie&format=html&locale=ko

지점에서 CMi (또는 M-TAB) 완료. 시맨틱 모드가 활성화 된 경우 시맨틱 파서 데이터를 사용하려고합니다. 시맨틱 모드가 비활성화되었거나 실패한 경우 선택한 태그 테이블을 사용하여 완료를 시도합니다 (태그 참조).

http://www.gnu.org/software/emacs/manual/html_node/emacs/Symbol-Completion.html#index-C_002dM_002di

엠-. (찾기 태그)가 태그 이름을 묻고 정의로 이동합니다.

http://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Tag.html#index-M_002d_002e

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