완전한 기능을 갖춘 C / C ++ IDE로 Emacs 사용


50

나는 Emacs를 C / C ++ IDE로 사용하기 위해 1 년 넘게 노력하고 있습니다. 나는 지금까지 약간의 성공을 거두었지만 그 길을 따라 몇 개의 벽돌 벽에 부딪쳤다. 현재 CEDET을 사용하려고하는데 효과적으로 사용하는 방법을 이해하는 데 어려움을 겪고 있습니다.

IDE에서 찾고있는 기능은 다음과 같습니다.

  1. 소프트웨어 "프로젝트"관리 IDE에서 현재 프로젝트를 구성하는 모든 파일을 이해하여 프로젝트 내에서 검색 및 바꾸기와 같은 기능을 수행하기를 원합니다. (지원 파일이 많은 소스 트리를 낭비하지 않고 이것을 달성 할 수 있다면 좋을 것입니다. 프로젝트 당 둘 이상의 중앙 집중식 프로젝트 파일이 필요한 이유는 무엇입니까?)
  2. 현재 방문중인 버퍼에 관계없이 IDE 내에서 현재 프로젝트를 빌드하는 기능. 현재 프로젝트를 빌드 할 키를 바인딩 할 수 있어야합니다.
  3. 오류보고 빌드 도구에서보고 된 오류를 찾기 위해 500 줄 이상의 출력을 읽을 필요가 없습니다. 바람직하게는, 에러는 에러 당 하나의 라인으로 자신의 버퍼에 나타난다.
  4. 프로젝트 내에서 기호에 대한 인식 및 정의 된 위치. 프로젝트 파일 또는 시스템 포함 파일에 있는지 여부에 관계없이 기호 정의로 이동하고 싶습니다.
  5. 시각적 디버깅. 코드를 단계별로 업데이트 할 때 자동으로 업데이트되는 로컬 변수의 감시 목록을 원합니다. 코드에서 중단 점을 설정하여 다음에 실행될 코드 줄을 확인하고 싶습니다.

EDE, Semantic, GDB 등을 사용하여 한 번에 하나씩 작동했기 때문에 이러한 각 기능이 존재한다는 것을 알고 있습니다. 문제는 이러한 기능을 모두 동시에 작동시킬 수 없었습니다. 각 조각은 대개 자체적으로 구성되어야하기 때문에 모든 조각을 한 번에 구성하고 함께 작동시키는 방법을 알아내는 것은 일반적으로 너무 많은 작업입니다.

Emacs를 모든 기능을 갖춘 C / C ++ IDE로 전환하기위한 솔루션은 무엇입니까? 항상 모든 부분을 구성해야합니까, 아니면 한 번에 모든 기능을 설정하는 방법이 있습니까?

편집 : 이 질문에 대한 정답은 주어진 다섯 가지 기준을 모두 정확하게 충족시킬 필요는 없습니다. IDE가 "모든 기능을 갖춘"것으로 간주하기 전에보고자하는 기능 유형에 대한보다 구체적인 아이디어를 제공하기 위해 목록을 제공했습니다. CEDET이 청구서에 적합 할 수는 있지만, 처음부터 설정하는 방법에 대한 단계별 자습서를 아직 찾지 못했습니다.


6
이 질문은 여러 가지로 나눌 수 있습니다. 당신은 어떤 부분도받을만한주의를 기울이지 않는 부분적인 답을 얻을 수 있습니다.
Malabarba


6
@ Malabarba : 다섯 개의 별도의 질문을하는 경우 중복 될 수 있습니다. 이 질문의 요점은 5 가지 목표를 달성하는 5 가지 패키지가있을 수 있지만 5 가지를 서로 잘 플레이하도록 구성하는 것은 거의 불가능 해 보입니다. "Emacs는 구성하는 데 불가능한 시간이 걸리기 때문에 완전한 기능을 갖춘 IDE로 기능 할 수 없습니다." 그럼 그렇습니다.
nispio

4
각 요점은 자체 질문 (잠재적으로 복제 됨) 일 수 있으며, 하나의 질문에 모두 모으면 패키지 상호 작용으로 인해 때로는 다른 답변을 얻을 수 있습니다.
Jonathan Leech-Pepin

답변:


27

언어마다 다른 수준의 "IDE-ness"가 존재하지만 불행히도 어떤 구성 없이도 완전한 IDE 기능을 사용하지 못할 것입니다. CEDET은 지원되는 언어에 대한 모든 요구를 충족시키는 완벽한 솔루션을 목표로하지만 개인적으로는 제대로 작동하지 않습니다. 대신 IDE 기반을 다루기 위해 몇 가지 패키지를 사용합니다. 내가 아는 다른 언어에 대한 몇 가지 솔루션을 사용하여 포인트를 순서대로 살펴 보겠습니다.

  1. projectile 은 실제 IDE와 비슷한 경험을 제공하는 가장 가까운 패키지입니다. 프로젝트별로 유용한 기능을 제공합니다. 아마도 일종의 창 / 작업 공간 관리를 원할 것입니다. wacspace 라는 자체 솔루션을 사용 하지만 다른 좋은 솔루션으로는 원근법 , 작업 그룹엘 스크린이 있습니다.
  2. 언어마다 "빌드"에 대한 아이디어가 다르지만 M-x compile거의 모든 것을 수용 할 수 있으며 오류를 통한 페이징을 쉽게 할 수 있습니다 (사용하기 만하면 됨 next-error). 디렉토리 변수 를 설정 하여 프로젝트별로 쉽게 사용자 정의 할 수 있습니다 compile-command. ( )를 compile사용하여 발사체로 실행할 수 있습니다 .projectile-compile-projectC-c p c
  3. M-x compile또한 여기에서 다루었습니다. 오류는 *compilation*버퍼 에서 한 줄에 하나씩 발생 하며 쉽게 페이징 할 수 next-error있습니다.
  4. 심볼로 점프하는 것은 "코드 이해"와 관련이 있으며, 언어마다 지원이 크게 달라집니다. Elisp의 경우 우수한 elisp-slime-nav 를 사용한 다음 M-.정의로 이동할 수 있습니다. 다음은 다른 언어에 대한 유사한 지원을 제공하는 일부 패키지입니다. CIDER (for Clojure); SLIME (공통 리스프 용); 가운 (루비); C / C ++의 의미 또는 clang-tags (면책 조항 : 나는 결코 사용하지 않았으므로 제대로 작동하는지 전혀 모른다). 다른 모든 방법이 실패하면 풍부한 ctags 와 같은 것을 사용하여 Emacs의 내장 TAGS 기능을 사용할 수도 있지만 TAGS로 만족할만한 결과를 얻지 못했습니다.
  5. Emacs는 디버거에 대한 지원이 매우 흩어져 있습니다. GUD 가있는 GDB 는 C와 같은 언어에 가장 적합한 방법입니다. 그렇지 않으면, 언어에 따라 거의 전적으로 다릅니다. (언어 간 시각적 디버깅이 실제로 현실적인 목표라고 생각하지 않습니다.)

4
사이드 노드로서 프로젝트 스위치 자동 생성 projectile과 직접 통합 할 수 있습니다 . perspectiveperspective-per-project
Jonathan Leech-Pepin

나는 semantic# 4 에 대한 메모를 추가 할 것이고 시맨틱은 훌륭한 패키지이며 코드를 이해하고 해당 정보로 많은 유용한 일을 할 수 있습니다.
Jordon Biondo

나는 실제로 사용하지 않았으며 semanticC ++ 지원이 불완전하다는 것을 기억하지만 대답에 추가했습니다.
shosti

15

내가 사용 이 가이드 는 C ++ IDE로 이맥스 사용을 시작하기를. 여기 에는 여러 가지 질문에 대한 답변을 제공하는 HelmProjectile 이 도입되었습니다 . 재치려면

  1. 발사체는 프로젝트를 관리합니다. 디렉토리 파일에서 Makefile, SConstruct, Git repo, SVN repo 및 기타 다른 빌드 시스템 또는 버전 제어 파일을 검색하여 현재 프로젝트와 관련된 파일을 자동으로 학습합니다. 예를 들어 Helm을 사용하여 현재 프로젝트에서 파일을 찾는 C-c p h실행 helm-projectile입니다.

  2. 발사체는 프로젝트를 구축 할 수 있습니다. C-c p c실행 projectile-compile-project실행하려고 / SCons는 / CMake 사용할 파일을 기반으로 확인합니다. 나는 이것을 구성 할 필요가 없었다; 그것은 무엇을해야하는지 항상 알고있었습니다.

  3. 실행할 때 오류가 자체 버퍼에 표시 projectile-compile-project되지만 원하는대로 예쁜지 잘 모르겠습니다.

  4. 프로그램 helm-gtags과 인터페이스 하는 패키지 gtags(시스템에서 사용 가능해야 함)를 사용할 수 있습니다. gtags는 GNU 프로젝트이므로 Windows에서 즉시 작동하지는 않습니다.

    일단 구성되면 Helm은 프로젝트의 기호를 인식하고 정의를 탐색하고 위치를 사용할 수 있습니다. 예를 들어 helm-gtags-dwim변수 나 함수의 사용으로 건너 뛸 수 있으며 헤더 파일에서 실행될 때 해당 헤더 파일이 열립니다.

  5. 아직 시도하지 않았습니다.

나열된 안내서는 시작 방법에 대한 매우 명확한 구성 정보를 제공합니다.


나는 그 안내서를 우연히 발견하여 적용했다. IMHO 그것은 다소 무겁고 많은 기본 이맥스 상호 작용을 너무 많이 바꿉니다. 버퍼에 현재 디렉토리를 쉽게 열거 나 몇 번의 키 입력으로 하위 하위 디렉토리에서 파일을 여는 것과 같은 일반적인 단축키를 방해하여 여러 가지 관련 구성을 비활성화했습니다. 그러나 살펴볼 가치는 있지만 전체적으로가 아니라 단계별로 시도해야합니다.
Stéphane Gourichon

9

이제 모든 기능을 갖춘 C / C ++ IDE를 요청하고 있으므로 자격이있을 수 있습니다.

vc4에서 Visual Studio 2010까지 모든 MS IDE를 사용했기 때문에 원하는 것을 완전히 이해했습니다.

좋은 소식은 Emacs가 Visual Studio만큼 95 % 나 좋고 더 많은 일을 할 수 있다는 것입니다. "더 많은"부분에 관심이 없을 수도 있습니다. 그래서 나는 당신의 질문에만 집중할 것입니다.

이제 핵심 은 CMake사용해야 하며 C ++ 응용 프로그램조차도 Windows 전용입니다! 이야기의 끝. 다른 선택은 없습니다, 나는 내가 말하는 것을 알고 있습니다. CMake를 사용하지 않으면 계속해도 의미가 없습니다.

질문 1에 대한 답변 : 당신은 아무것도 설정할 필요가 없습니다 . 다른 플러그인을 설정하는 cpputils-cmake ( https://github.com/redguardtoo/cpputils-cmake )를 설치 하십시오 . Visual Studio보다 훨씬 편리합니다. 따라서 프로젝트 별 설정이 필요하지 않습니다. 검색 대체를 위해 bash / perl / git과 percol ( https://github.com/mooz/percol ) 의 힘을 결합하여 IDE보다 훨씬 좋습니다. 내 블로그 ( http://blog.binchen.org/categories/emacs.html )와 ~ / .bashrc ( https://gist.github.com/redguardtoo/01868d7a13817c9845e8#file-bashrc )를 확인하십시오. 예를 들어, 특정 커밋에서 파일을 교체하여 검색 할 수 있습니다.

질문 2에 대한 답변 : 그것은 이미 cpputils-cmake에 의해 설정되어 M-x compile있으며 평소와 같이 필요 합니다.

질문 3에 대한 답 : 질문 2와 동일합니다. 이것이 왜 문제인지 모르겠습니다. 더 나은 키 바인딩을 통해 VS와 정확히 동일한 동작입니다.

질문 4에 대한 답변 : 이제 대부분의 사람들은 cpputils-cmake와 결합 할 수있는 Gnu Global을 사용합니다. 실제 문제는 포함 된 모든 C ++ 헤더를 포함하는 디렉토리를 자동으로 감지한다는 것을 이해합니다 . 그것은 cpputils-cmake로 수행 할 수 있습니다. 다른 모든 것은 쉽습니다. 제발 man global쉘에서 환경 변수 GTAGSLIBPATH에 대한 설명서를 읽어. 코드 탐색을 위해 Global을 기반으로 멋진 UX를 제공하는 많은 플러그인이 있습니다. ggtags.el을 권장합니다.

질문 5에 대한 답변 : 비주얼 디버깅, 많은 사람들이 추천했습니다 M-x gdb-many-window, 나는 그것을 시도했지만 작동하지 않았습니다. 내 gdb 버전이 오래되어 (힌트, OSX 10.7.3을 사용하고 있음) OS를 업그레이드하기에는 너무 게으 르기 때문입니다. 그러나 GUD는 괜찮습니다. 편집기 창에서 변수를 인쇄하는 짧은 키를 만듭니다. 모든 디버그 내용을 사용할 수 있습니다. VS로 테이블 UX 레이아웃이 없습니다. 그러나 당신에게 정직합니다. Microsoft의 디버거 UX도 세계 최고는 아닙니다. 가장 사용자 친화적 인 디버거는 DDD입니다 ( http://www.gnu.org/software/ddd/). Gud와 VS는이 문제를 잘 알고 있습니다. 요즘에는 다른 Emacs 플러그인 인 yasnippet으로 로깅 코드를 삽입합니다. 명확히하기 위해 브레이크 포인트에 대한 모든 고급 트릭을 알고 있습니다.이 트릭을 적용하기에는 너무 게으 르기 때문입니다. Emacs에 로깅 코드를 삽입하는 것이 훨씬 쉽습니다.

IDE에 대한 더 많은 것들이 있습니다 : 코드 완성? 회사 모드를 사용하고 설정이 필요하지 않습니다. 실시간 구문 검사? cpputils-cmake를 사용하고(flymake-mode 1)

가장 좋은 방법은 https://github.com/redguardtoo/emacs.d 에서 내 설정을 사용하는 경우 VS보다 적은 설정이 필요하다는 것입니다. 해당 설정의 제목은 "purcell 's emacs configuration plus C / C ++ support" 입니다.

이제 강조해야 할 것이 있습니다 . 이맥스는 여러분에게 완전한 자유를 줍니다. 시작할 방법을 선택할 수 있습니다. 어려운 방법이나 쉬운 방법.

쉬운 방법은 내 설정 (또는 github의 모든 사람의 설정, 처음에는 별을 세는 것)을 복사하는 것입니다 .5 분 안에 완전히 작동하는 C ++ IDE를 갖게됩니다. VS는 5 분 안에 시작되지 않았습니다.

어려운 방법은 처음부터 설정을 조정하는 것입니다. 어려운 방법을 선택한다면 Emacs에 불만을 제기하지 마십시오 . 당신의 선택입니다.

BTW는 장기적으로 약간의 Emacs Lisp 지식이 도움이 될 수 있습니다. MS sh * t에 낭비되는 시간을 비교 한 전문 C ++ 개발자에게는 사소한 일이라고 생각합니다. 몇 년 전 MS는 일부 Windows 업데이트에서 VC 런타임을 자동으로 업그레이드했습니다. 회사 컴퓨터에서는 제품이 제대로 작동하지만 고객 컴퓨터에서는 충돌했습니다 .

그 사건 이후, 나는 Richard Stallman을 이해하기 시작했습니다.


1
흥미 롭군 "CMake를 사용해야합니다"-> 따라서 autoconf 또는 개인 스크립트를 사용하는 임의의 무료 소프트웨어 패키지에서 작업 할 때는 래퍼를 작성해야한다고 말하고 CMakeLists.txt있습니까?
Stéphane Gourichon

1
cmake 솔루션만큼 완벽하지 않고 대신 GNU Global을 사용할 수 있습니다. 그러나 더 유연합니다. blog.binchen.org/posts/emacs-as-c-ide-easy-way.html
chen bin

5

# 4의 경우, 나는 수년간 사용했던 풍부한 태그와 내장 태그 지원을 강력히 추천합니다. 또는 방금 최근에 GNU Global 및 ggtags 패키지를 사용하도록 전환했으며 약간 우수하다는 것을 알았습니다. 그러나 그들은 거의 동일하게 작동합니다. 둘 다 구성이 거의없이 작동합니다. 다른 IDE 기능의 경우 자동 완성 패키지도 좋아합니다. 마찬가지로, M-x compile광범위하게 사용 하고 전역 키를 다음 및 이전 오류에 바인딩합니다. "프로젝트"내에서 검색하려면 일반적으로을 사용 M-x find-grep합니다. 다음 및 이전 오류에 대해 동일한 키 바인딩을 사용합니다.


4

소프트웨어 "프로젝트"관리 IDE에서 현재 프로젝트를 구성하는 모든 파일을 파악하여 프로젝트 내에서 검색 및 바꾸기와 같은 기능을 수행하기를 원합니다. (지원 파일이 많은 소스 트리를 낭비하지 않고 이것을 달성 할 수 있다면 좋을 것입니다. 프로젝트 당 둘 이상의 중앙 집중식 프로젝트 파일이 필요한 이유는 무엇입니까?)

Projectile 은 emacs에서 프로젝트 관리에 가장 적합한 옵션 인 것 같습니다. 매우 가볍기 때문에 프로젝트에 추가 파일을 추가 할 필요가 없습니다. 특정 특수 파일의 존재 여부에 따라 프로젝트를 자동으로 감지하려고 시도합니다. 예를 들어-자식 저장소에서 작업하는 경우 projectile은 프로젝트로 처리합니다 (git가 추적하는 모든 파일은 프로젝트의 일부로 취급 됨) projectile-find-file. 프로젝트를 여는 파일 과 같은 명령을 사용할 수 있습니다 . 프로젝트별로 작동하는 다른 명령이 많이 있습니다.

오류보고 빌드 도구에서보고 된 오류를 찾기 위해 500 줄 이상의 출력을 읽을 필요가 없습니다. 바람직하게는, 에러는 에러 당 하나의 라인으로 자신의 버퍼에 나타난다.

Flycheck 는 clang / gcc를 사용한 구문 검사를 지원합니다.

프로젝트 내에서 기호에 대한 인식 및 정의 된 위치. 프로젝트 파일 또는 시스템 포함 파일에 있는지 여부에 관계없이 기호 정의로 이동하고 싶습니다.

rtags를 살펴 보는 것이 좋습니다 . clang을 백엔드로 사용하고 정의와 완성으로 뛰어 드는 아주 좋은 일입니다. clang을 사용하여 오류 및 경고를 표시하기 위해 flymake와 통합되기 때문에 # 3에도 도움이 될 수 있습니다. 또한 리팩토링에 대한 지원이 제한되어 있습니다. 지능적인 자동 완성을위한 또 다른 옵션은 아이러니 모드입니다.


2

현재 Emacs와 함께 제공되는 CEDET 버전은 설정하기 어렵지만 공식 사이트 에서 얻을 수있는 버전은 설정하기 가 더 쉽고 # 2 및 # 4 요구에 응답 할 수 있습니다.

CEDET의 EDE를 사용하면 예를 들어 makefile 및 automake 프로젝트를 관리하고 대상을 추가하고 파일을 대상에 연결할 수 있습니다. 그런 다음 EDE 명령을 사용하여 프로젝트를 컴파일 할 수 있습니다. Emacs의 내장 컴파일 모드를 사용하기 때문에 # 3도 만족합니다.

CEDET의 시맨틱에는 C ++를 포함한 여러 언어에 대한 파서가 있습니다. exuberant-ctags 및 GNU Global과 같이 파일에 정의 된 태그를 검색 할 수 있지만 정확한 자동 완성 및 점프 기능도 있습니다. "foo"라는 두 가지 방법이있는 경우 시맨틱의 점프는 올바른 방법으로 넘어갈 수있을만큼 똑똑합니다.

# 1의 경우 개인적으로 projectile을 사용 하고 몇 번 전에 GDB 를 # 5로 성공적으로 사용했습니다 .

힌트 # 3 힌트 : EDE가 과도하게 사용되는 경우, Emacs는 M-x recompile마지막 컴파일 명령을 실행 하는 명령 을 가지고 있으므로 컴파일을 한 번 실행 한 다음 recompile버퍼에서 사용할 수 있습니다 .


1

# 4의 경우 YouCompleteme 이라는 새로운 프로젝트 와 그 다음 멋진 것으로 보이는 해당 Emacs 클라이언트 인 것 같습니다. clang을 사용하기 때문에 태그 또는 전역보다 코드를 더 잘 볼 수 있습니다.


1
제안에 감사하지만 잘 통합 된 것을 찾고 있기 때문에 프로토 타입 Emacs 클라이언트와 함께 Vim 플러그인을 사용하여 기능 중 하나를 얻는 것이 최선의 출발점인지 확실하지 않습니다.
nispio

3
시도 github.com/abingham/emacs-ycmd (이 사용주의 이맥스 클라이언트 대신 github.com/Valloric/ycmd 하지 github.com/Valloric/YouCompleteMe ). 회사 모드 (여기 다른 답변에서 권장)와 함께 작동하므로 나머지 Emacs와 잘 통합됩니다. MELPA에서 ycmd 및 company-ycmd를 설치할 수 있습니다 ( sprunge.us/LXGY 는 내 구성입니다). ycmd에 대한 빌드 지시 사항을 따르십시오. 유일한 도전은 github.com/Valloric/ycmd/blob/master/examples/
unhammer

1

나는 소스 저장소 + ECB + gtags + cscope에서 CEDET에 만족했습니다. 즉,이 게시물에는 내가 시도 할 많은 제안이 있습니다.


1
모든 도구를 함께 작동시키기 위해해야 ​​할 일에 대해 설명해 주시겠습니까?
nispio

4
현재 이것은 거의 잘못된 주석처럼 보입니다. :-) 친절하면 조금 정교하게 작성하십시오.
Malabarba

간결한 것에 대해 죄송합니다. StackExchange 앱은 돔에 익숙해집니다. 이 솔루션은 소스 탐색 및 분석을 다루는 # 4로 응답합니다. 물론 CEDET에는 의미가 포함되어 있습니다. ECB는 Emacs Code Browser이며 CEDET을 사용하여 메소드를 나열하고 심볼 정보를보고합니다. Gtags와 Cscope는 소스 기반에서 기호 정보 테이블을 작성하고 (조수도이를 수행) 태그 또는 기호로 탐색 할 수 있도록 Emacs와 통합합니다.
Clay Haapala

1

위의 부분에서 언급했듯이 발사체 (선택적으로 조타 장치)는 프로젝트 관리를위한 훌륭한 솔루션입니다.

Ycmd는 코드 완성 및 일부 탐색에 적합하며 최상의 클라이언트는 emacs-ycmd입니다 (전체 공개 : emacs 클라이언트를 작성했습니다).

"태그"와 인덱싱의 경우 내가 찾은 가장 좋은 전체 솔루션은 코드 검색입니다 (더 많은 공개 : 나도 이것을 작성했습니다.) 실제로 정규식 검색을 수행한다는 점에서 상당히 바보입니다.하지만 엄청나게 빠르며 일반적으로 필요한 모든 것입니다. 여러 언어에서 잘 작동합니다.

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