Używanie Emacsa jako w pełni funkcjonalnego C / C ++ IDE

50

Od ponad roku próbuję używać Emacsa jako IDE C / C ++. Do tej pory odnosiłem tylko niewielkie sukcesy, ale po drodze natknąłem się na kilka ceglanych ścian. Obecnie próbuję użyć CEDET, ale mam trudny czas, aby zrozumieć, jak go skutecznie używać.

Funkcje, których szukam w IDE, są następujące:

  1. Zarządzanie „projektami” oprogramowania Chcę, aby moje IDE znało wszystkie pliki, które składają się na mój bieżący projekt, aby umożliwić mi wykonywanie funkcji takich jak wyszukiwanie i zamiana w moim projekcie. (Byłoby miło, gdybym mógł to osiągnąć bez zaśmiecania mojego drzewa źródłowego dużą ilością plików pomocniczych. Dlaczego potrzebuję więcej niż jednego scentralizowanego pliku projektu na projekt?)
  2. Możliwość zbudowania bieżącego projektu z poziomu IDE, niezależnie od tego, który bufor aktualnie odwiedzam. Muszę być w stanie powiązać klucz, który zbuduje bieżący projekt.
  3. Zgłaszanie błędów. Nie chcę czytać ponad 500 wierszy danych wyjściowych, aby znaleźć błędy zgłoszone przez narzędzia kompilacji. Korzystnie błędy pojawiają się w swoim własnym buforze z jedną linią na błąd.
  4. Świadomość symboli w projekcie i miejsca ich zdefiniowania. Chcę przejść do definicji symbolu, niezależnie od tego, czy znajduje się ona w moich plikach projektu, czy w plikach systemowych.
  5. Debugowanie wizualne. Chcę mieć listę obserwacyjną zmiennych lokalnych, które aktualizują się automatycznie, gdy przeglądam kod. Chcę mieć możliwość ustawienia punktów przerwania w kodzie, aby zobaczyć, który wiersz kodu zostanie wykonany w następnej kolejności.

Wiem, że każda z tych funkcji istnieje, ponieważ każda z nich pracowała w tym samym czasie przy użyciu EDE, Semantic, GDB itp. Problem polega na tym, że nigdy nie byłem w stanie mieć tych wszystkich funkcji jednocześnie , ponieważ każdy element zwykle musi być skonfigurowany sam, a zwykle jest zbyt wiele pracy, aby wymyślić, jak skonfigurować wszystkie z nich jednocześnie i sprawić, by działały razem.

Jakie rozwiązania istnieją, aby zmienić Emacsa we w pełni funkcjonalne C / C ++ IDE? Czy zawsze musisz konfigurować wszystko fragmentarycznie, czy jest sposób na skonfigurowanie wszystkich funkcji jednocześnie?

EDYCJA: Dobra odpowiedź na to pytanie nie musi dokładnie spełniać wszystkich pięciu podanych kryteriów. Po prostu podałem listę, aby dać bardziej konkretne pojęcie o rodzaju funkcji, które chcę zobaczyć, zanim uznam IDE za „w pełni funkcjonalny”. Jest całkiem możliwe, że CEDET będzie w stanie wpasować się w rachunek, ale jeszcze nie znalazłem działającego samouczka krok po kroku, jak ustawić go od zera.

nispio
źródło
6
To pytanie może być lepiej podzielone na kilka. Może się zdarzyć, że uzyskasz kilka częściowych odpowiedzi, w których żaden z elementów nie zostanie poświęcony uwagi, na jaką zasługują.
Malabarba
2
Ponadto pozycja 1 może być duplikatem emacs.stackexchange.com/questions/448/…
Malabarba
6
@Malabarba: Gdybym zadał pięć osobnych pytań, może to być duplikat. Chodzi o to, że może istnieć pięć różnych pakietów, które osiągają pięć różnych celów, ale skonfigurowanie wszystkich pięciu tak, aby ładnie ze sobą grały, wydaje się prawie niemożliwe. Jeśli odpowiedź wróci jako „Emacs nie może działać jako w pełni funkcjonalne IDE, ponieważ konfiguracja zajmuje niemożliwie dużo czasu”. niech tak będzie.
nispio
4
Każdy z punktów może być własnym pytaniem (potencjalnie zduplikowanym), połączenie ich wszystkich w jednym pytaniu może czasem prowadzić do różnych odpowiedzi z powodu interakcji pakietu.
Jonathan Leech-Pepin
Powiązane: emacs.stackexchange.com/q/3359/2264
Sean Allred

Odpowiedzi:

27

Istnieją różne poziomy „IDE” dla różnych języków i niestety nigdy nie uzyskasz pełnych funkcji IDE bez pewnej konfiguracji (jeśli nie lubisz konfigurować rzeczy, prawdopodobnie nie powinieneś używać Emacsa). CEDET ma być kompletnym rozwiązaniem, które zaspokoi wszystkie Twoje potrzeby w zakresie obsługiwanych języków, ale osobiście nigdy nie udało mi się, aby działał poprawnie; zamiast tego używam kilku pakietów w tandemie do pokrycia moich baz IDE. Omówię twoje punkty w kolejności, z kilkoma rozwiązaniami dla różnych języków, które znam:

  1. pocisk jest najbliższym pakietem zapewniającym prawdziwe wrażenia podobne do IDE. Zapewnia mnóstwo użytecznych funkcji dla poszczególnych projektów. Prawdopodobnie będziesz również potrzebować pewnego rodzaju zarządzania oknami / obszarem roboczym; Używam własnego rozwiązania o nazwie wacspace , ale inne dobre rozwiązania obejmują perspektywę , grupy robocze i ekran .
  2. Różne języki mają różne wyobrażenia o tym, czym jest „kompilacja”, ale M-x compilemogą pomieścić prawie wszystko i ułatwiają stronicowanie po błędach (wystarczy użyć next-error). Możesz łatwo dostosowywać dla poszczególnych projektów, używając zmiennych katalogowych do ustawienia compile-command. Możesz uruchomić compilepocisk za pomocą projectile-compile-project( C-c p c).
  3. M-x compileomówiono tu również - błędy zwykle kończą się jednym w linii w *compilation*buforze, z łatwym stronicowaniem za pomocą next-error.
  4. Przeskakiwanie do symbolu wiąże się z „zrozumieniem twojego kodu” i właśnie tam wsparcie różni się ogromnie w różnych językach. W przypadku Elisp możesz użyć doskonałego elisp-slime-nav , a następnie M-.przejść do definicji. Oto niektóre pakiety, które zapewniają podobne wsparcie dla innych języków: CIDER (dla Clojure); SLIME (dla Common Lisp); szlafrok (dla Ruby); znaczniki semantyczne lub clang dla C / C ++ (zrzeczenie się: Nigdy też nie użyłem, więc nie mam pojęcia, czy działają dobrze). Jeśli wszystko inne zawiedzie, możesz również skorzystać z wbudowanych funkcji Emacsa TAGS, używając czegoś w rodzaju bujnych ctagów , ale nigdy nie osiągnąłem zadowalających wyników z TAGS.
  5. Emacs ma bardzo rozproszone wsparcie dla debuggerów. GDB z GUD to najlepszy wybór dla języków podobnych do C; w przeciwnym razie jest to prawie całkowicie w zależności od języka. (Nie wydaje mi się, aby debugowanie między językami było naprawdę realistycznym celem.)
shosti
źródło
4
Jako węzeł boczny projectilemożna zintegrować bezpośrednio z perspectivetworzeniem perspective-per-projectprzełącznika projektu automatycznie.
Jonathan Leech-Pepin
Dodałbym uwagi semanticdo nr 4, semantyczny to świetny pakiet, który rozumie twój kod i może zrobić wiele przydatnych rzeczy z tymi informacjami.
Jordon Biondo
Nigdy tak naprawdę nie korzystałem semantici myślę, że pamiętam, że ma niepełną obsługę C ++, ale dodałem ją do odpowiedzi.
shosti
15

Skorzystałem z tego przewodnika, aby zacząć używać Emacsa jako IDE C ++. Wprowadza hełm i pocisk, które pomagają odpowiedzieć na wiele twoich pytań. To znaczy

  1. Pocisk zarządza projektami. Przeszukuje drzewo katalogów w poszukiwaniu plików Makefile, SConstruct, Git repo, SVN repo i być może niektórych innych plików systemu kompilacji lub kontroli wersji, aby automatycznie dowiedzieć się, jakie pliki są powiązane z bieżącym projektem. Na przykład C-c p hdziała, helm-projectilektóry używa Helm do znalezienia pliku w bieżącym projekcie.

  2. Pocisk może budować twoje projekty. C-c p curuchamia, projectile-compile-projectktóry próbuje uruchomić Make / SCons / CMake na podstawie dostępnych plików. Nigdy nie musiałem tego konfigurować; zawsze wiedział, co robić.

  3. Błędy pojawiają się we własnym buforze po uruchomieniu, projectile-compile-projectale nie jestem pewien, czy jest tak ładny, jak byś chciał.

  4. Możesz użyć pakietu, helm-gtagsktóry łączy się z gtagsprogramem (który powinieneś mieć dostępny w systemie). Zauważ, że gtags jest projektem GNU i dlatego jest mało prawdopodobne, aby działał natychmiast w systemie Windows.

    Po skonfigurowaniu Helm rozpoznaje symbole w projekcie i może nawigować do definicji i używać lokalizacji. Na przykład helm-gtags-dwimmożna przejść do dowolnego użycia zmiennej lub funkcji, a po uruchomieniu w pliku nagłówkowym otwiera ten plik nagłówkowy.

  5. Jeszcze tego nie próbowałem.

Wymieniony przewodnik zawiera bardzo wyraźne informacje na temat konfiguracji, jak zacząć.

Patrick Steele
źródło
Natknąłem się również na ten przewodnik i zastosowałem go. IMHO jest jakoś ciężki i za bardzo zmienia wiele podstawowych interakcji emacsa. Wyłączyłem wiele konfiguracji związanych ze sterem, ponieważ kolidowały one ze zwykłymi skrótami (np. Łatwe otwieranie bieżącego katalogu w buforze lub otwieranie pliku w podkatalogu za pomocą kilku naciśnięć klawiszy). Warto jednak rzucić okiem, ale prawdopodobnie należy go wypróbować krok po kroku, a nie jako całość.
Stéphane Gourichon,
9

Ponieważ pytasz teraz o w pełni funkcjonalne C / C ++ IDE, mogę zostać zakwalifikowany.

Użyłem wszystkich MS IDE od vc4 do Visual Studio 2010, więc w pełni rozumiem, czego chcesz.

Dobrą wiadomością jest to, że Emacs może być w 95% tak dobry jak Visual Studio i może zrobić znacznie więcej. ale możesz nie być zainteresowany częścią „więcej”. Dlatego skupię się tylko na twoich pytaniach.

Teraz kluczową kwestią, MUSISZ UŻYWAĆ CMake , nawet Twoja aplikacja C ++ jest przeznaczona tylko dla systemu Windows! Koniec opowieści. Nie ma innego wyboru, wiem o czym mówię. Jeśli nie używasz CMake, kontynuowanie jest bezcelowe.

Odpowiedź na pytanie 1 : Nie musisz niczego konfigurować, zainstaluj cpputils-cmake ( https://github.com/redguardtoo/cpputils-cmake ), który konfiguruje inne wtyczki. Jest to nawet wygodniejsze niż Visual Studio. Dlatego konfiguracja dla jednego projektu nie jest potrzebna. W przypadku wyszukiwania zamiast rzeczy łączę moc bash / perl / git i percol ( https://github.com/mooz/percol ), co jest znacznie lepsze niż jakiekolwiek IDE. sprawdź mój blog ( http://blog.binchen.org/categories/emacs.html ) i mój ~ / .bashrc ( https://gist.github.com/redguardtoo/01868d7a13817c9845e8#file-bashrc ). Na przykład mogę wyszukiwać zastępować pliki w niektórych zatwierdzeniach.

Odpowiedź na pytanie 2 : Jest już skonfigurowane przez cpputils-cmake, potrzebujesz M-x compilejak zwykle.

Odpowiedź na pytanie 3 : to samo co pytanie 2. Nie wiem, dlaczego to jest problem. jest dokładnie takie samo zachowanie jak VS, z lepszymi powiązaniami klawiszy.

Odpowiedź na pytanie 4 : Teraz większość ludzi korzysta z Gnu Global, które można łączyć z cpputils-cmake. Rozumiem, że prawdziwym problemem jest automatyczne wykrywanie katalogów zawierających wszystkie zawarte nagłówki C ++ . Można to zrobić za pomocą cpputils-cmake, wszystko inne jest łatwe. Proszę man globalw powłoce i przeczytać instrukcję o zmiennej środowiskowej GTAGSLIBPATH. Istnieje wiele wtyczek do dostarczania ładnego UX opartego na Global do nawigacji kodu, polecam ggtags.el

Odpowiedź na pytanie 5 : Debugowanie wizualne. Wiele osób polecało M-x gdb-many-window, próbowałem, ale to nie działało. Po prostu dlatego, że moja wersja gdb jest nieaktualna (wskazówka, używam OSX 10.7.3) i jestem zbyt leniwy, aby zaktualizować mój system operacyjny. Ale GUD ma się dobrze. Tworzę krótki klawisz, aby wydrukować dla mnie zmienną w oknie edytora. wszystkie rzeczy do debugowania są użyteczne. Nie ma układu tabeli UX jako VS. ale szczerze mówiąc z tobą. Debuger UX firmy Microsoft również nie jest najlepszy na świecie. Najlepszym przyjaznym dla użytkownika debuggerem jest DDD ( http://www.gnu.org/software/ddd/). Zarówno Gud, jak i VS są do kitu. Obecnie po prostu wstawiam kod rejestracyjny z yasnippet, który jest kolejną wtyczką Emacsa. Aby to wyjaśnić, znam wszystkie zaawansowane sztuczki dotyczące punktów przerwania, tylko dlatego, że jestem zbyt leniwy, aby zastosować te sztuczki. Wstawianie kodu logowania do Emacsa jest znacznie łatwiejsze.

Jest wiele innych rzeczy o IDE: uzupełnianie kodu? użyj trybu firmowego, bez potrzeby konfiguracji. sprawdzanie składni w czasie rzeczywistym? użyj cpputils-cmake(flymake-mode 1)

Najlepszą rzeczą jest to, że musisz wykonać mniejszą konfigurację niż VS, jeśli używasz mojej konfiguracji na ( https://github.com/redguardtoo/emacs.d ) Ta konfiguracja ma tytuł „Konfiguracja emacsa purcell plus obsługa C / C ++” .

Teraz muszę podkreślić, Emacs daje ci pełną swobodę . Możesz wybrać dowolny sposób na rozpoczęcie. trudny lub łatwy sposób.

Prostym sposobem jest po prostu skopiowanie mojej konfiguracji (lub dowolnej konfiguracji github, najpierw policz gwiazdy), za 5 minut będziesz mieć w pełni funkcjonalne C ++ IDE. VS nie zakończył uruchamiania w ciągu tych 5 minut.

Najtrudniejszym sposobem jest ulepszenie konfiguracji od zera. Jeśli wybierzesz trudną drogę, nie narzekaj na Emacsa . To Twój wybór.

BTW, na dłuższą metę trochę wiedzy Emacsa Lispa może być pomocna. Myślę, że jest to trywialne dla profesjonalnego programisty C ++ w porównaniu do czasu, który zmarnowałem na MS sh * t. Wiele lat temu MS po cichu zaktualizowało środowisko wykonawcze VC w niektórych aktualizacjach systemu Windows. Sprawiło, że mój produkt działał poprawnie na komputerach firmy, ale zawiesił się na komputerach klientów .

Po tym incydencie zacząłem rozumieć Richarda Stallmana.

Chen Bin
źródło
1
Ciekawy. „MUSISZ UŻYWAĆ CMake” -> Mówisz więc, że pracując nad losowym pakietem darmowego oprogramowania korzystającym z autoconf lub skryptu osobistego, należy napisać opakowanie CMakeLists.txt?
Stéphane Gourichon,
1
Zamiast tego możesz użyć GNU Global, nie tak idealnego jak rozwiązanie cmake. Ale bardziej elastyczny, patrz blog.binchen.org/posts/emacs-as-c-ide-easy-way.html
chen bin
5

W przypadku # 4 gorąco polecam exuberant-ctags i obsługę wbudowanych tagów, z których korzystałem od lat. Alternatywnie, niedawno przestawiłem się na używanie GNU Global i pakietu ggtags i stwierdziłem, że są nieco lepsze; chociaż działają prawie identycznie. Oba działają prawie bez konfiguracji. W przypadku innych funkcji IDE podoba mi się również pakiet autouzupełniania. Podobnie, M-x compileintensywnie używam i wiążę klucze globalne z następnym i poprzednim błędem. Do wyszukiwania w „projektach” zazwyczaj używam M-x find-grep. Pamiętaj, że użyje tych samych powiązań klawiszy dla następnego i poprzedniego błędu.

b4hand
źródło
4

Zarządzanie „projektami” oprogramowania Chcę, aby moje IDE znało wszystkie pliki, które składają się na mój bieżący projekt, aby umożliwić mi wykonywanie funkcji takich jak wyszukiwanie i zamiana w moim projekcie. (Byłoby miło, gdybym mógł to osiągnąć bez zaśmiecania mojego drzewa źródłowego dużą ilością plików pomocniczych. Dlaczego potrzebuję więcej niż jednego scentralizowanego pliku projektu na projekt?)

Pocisk wydaje się najlepszą opcją do zarządzania projektami w emacsie. Jest bardzo lekki, nie musisz dodawać żadnych dodatkowych plików do swojego projektu. Spróbuje automatycznie wykryć dla Ciebie projekty na podstawie obecności niektórych plików specjalnych. Na przykład - jeśli pracujesz w repozytorium git, pocisk potraktuje go jako projekt (wszelkie pliki śledzone przez git będą traktowane jako część projektu), wtedy będziesz mógł użyć poleceń, takich jak projectile-find-fileotwarcie dowolnego pliku projektu. Ma wiele innych poleceń, które działają na podstawie projektu.

Zgłaszanie błędów. Nie chcę czytać ponad 500 wierszy danych wyjściowych, aby znaleźć błędy zgłoszone przez narzędzia kompilacji. Korzystnie błędy pojawiają się w swoim własnym buforze z jedną linią na błąd.

Flycheck obsługuje sprawdzanie składni za pomocą clang / gcc.

Świadomość symboli w projekcie i miejsca ich zdefiniowania. Chcę przejść do definicji symbolu, niezależnie od tego, czy znajduje się ona w moich plikach projektu, czy w plikach systemowych

Poleciłbym rzucić okiem na rtags . Wykorzystuje clang jako backend i całkiem niezłą robotę przeskakując do definicji i ukończenia. Może ci również pomóc w # 3, ponieważ integruje się również z Flymake, aby wyświetlać błędy i ostrzeżenia za pomocą clang. Poza tym ma pewne ograniczone wsparcie dla refaktoryzacji. Inną opcją inteligentnego automatycznego uzupełniania jest tryb ironii

Iqbal Ansari
źródło
2

Wersja CEDET dostarczana obecnie z Emacsem jest trudna do skonfigurowania, ale ta, którą można znaleźć na oficjalnej stronie, jest łatwiejsza do skonfigurowania i może odpowiadać twoim # 2 i # 4 potrzebom.

EDE programu CEDET pozwala na przykład zarządzać projektami makefile i automake, dodawać do nich cele i kojarzyć pliki z celami. Następnie możesz skompilować projekt za pomocą poleceń EDE. Ponieważ używa wbudowanego trybu kompilacji Emacsa, twoja potrzeba nr 3 jest również zaspokojona.

CEDET's Semantic ma parsery dla kilku języków, w tym C ++. Może pobierać tagi zdefiniowane w pliku, takie jak exuberant-ctags i GNU Global, ale ma także dokładne funkcje automatycznego uzupełniania i przeskakiwania. Jeśli masz dwie metody zwane „foo”, skok semantyczny jest wystarczająco sprytny, aby doprowadzić cię do właściwej.

W przypadku nr 1 osobiście używam pocisków i z powodzeniem korzystałem z GDB dla nr 5 kilka razy temu.

Wskazówka dla nr 3: Jeśli EDE jest dla ciebie przesadne, Emacs ma polecenie M-x recompileuruchomienia ostatniego polecenia kompilacji, dzięki czemu możesz uruchomić kompilację po raz pierwszy, a następnie użyć recompilew dowolnym buforze.

Steven Rémot
źródło
1

W przypadku nr 4 wydaje się, że jest to nowy projekt o nazwie YouCompleteme i odpowiadający mu klient Emacsa, który wydaje się kolejną fajną rzeczą. Ponieważ używa clang, ma lepszy widok na kod niż tagi lub globalny.

rlazo
źródło
1
Dzięki za sugestię, ale ponieważ szukam rzeczy, które dobrze się ze sobą integrują, nie jestem pewien, czy próba uzyskania jednej z funkcji za pomocą wtyczki Vim z prototypowym klientem Emacs jest najlepszym punktem wyjścia.
nispio
3
Spróbuj zamiast github.com/abingham/emacs-ycmd klienta emacs (pamiętaj, że używa github.com/Valloric/ycmd , a nie github.com/Valloric/YouCompleteMe ). Działa w trybie firmowym (zalecanym przez inne odpowiedzi tutaj), więc dobrze integruje się z resztą Emacsa. Możesz zainstalować ycmd i company-ycmd z MELPA ( sprunge.us/LXGY to moja konfiguracja); i postępuj zgodnie z instrukcjami kompilacji dla ycmd. Jedynym wyzwaniem jest trzeba umieścić swoje flagi kompilacji do pliku jak github.com/Valloric/ycmd/blob/master/examples/...
unhammer
1

Jestem zadowolony z CEDET z jego repozytorium źródłowego + ECB + gtags + cscope. To powiedziawszy, jest wiele sugestii w tym poście, które będę próbował.

Clay Haapala
źródło
1
Czy możesz wyjaśnić, co musiałeś zrobić, aby wszystkie te narzędzia działały razem?
nispio
4
W tej chwili wygląda to prawie na niewłaściwy komentarz. :-) Jeśli chcesz zrobić coś miłego, opracuj trochę.
Malabarba
Przepraszam, że jestem zwięzły. Aplikacja StackExchange wymaga przyzwyczajenia się do kopuły. To rozwiązanie odpowiada na pytanie nr 4 dotyczące nawigacji po symbolach i analizy źródła. CEDET oczywiście zawiera semantyczne. EBC jest przeglądarką kodów Emacsa i wykorzystuje CEDET do wyświetlania listy metod i zgłaszania informacji o symbolach. Zarówno Gtags, jak i Cscope budują tabele informacji o symbolach ze źródła (ster też to robi) i integrują się z Emacsem, aby umożliwić nawigację według znaczników lub symbolu.
Clay Haapala
1

Jak wspomniano powyżej, pocisk (opcjonalnie ze sterem) jest doskonałym rozwiązaniem do zarządzania projektami.

Ycmd doskonale nadaje się do uzupełniania kodu i nawigacji, a najlepszym klientem jest emacs-ycmd (pełne ujawnienie: napisałem klienta emacs).

Jeśli chodzi o „tagi” i indeksowanie, najlepszym ogólnym rozwiązaniem, jakie znalazłem, jest wyszukiwanie kodu (więcej informacji: ja też to napisałem.) Jest dość głupie, ponieważ naprawdę po prostu wyszukuje wyrażenia regularne, ale jest niesamowicie szybkie i ogólnie wszystko, czego potrzebujesz i działa dobrze w wielu językach.

abingham
źródło