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:
- 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?)
- 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.
- 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.
- Ś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.
- 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.
Odpowiedzi:
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:
M-x compile
mogą 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 ustawieniacompile-command
. Możesz uruchomićcompile
pocisk za pomocąprojectile-compile-project
(C-c p c
).M-x compile
omówiono tu również - błędy zwykle kończą się jednym w linii w*compilation*
buforze, z łatwym stronicowaniem za pomocąnext-error
.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.źródło
projectile
można zintegrować bezpośrednio zperspective
tworzeniemperspective-per-project
przełącznika projektu automatycznie.semantic
do nr 4, semantyczny to świetny pakiet, który rozumie twój kod i może zrobić wiele przydatnych rzeczy z tymi informacjami.semantic
i myślę, że pamiętam, że ma niepełną obsługę C ++, ale dodałem ją do odpowiedzi.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
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 h
działa,helm-projectile
który używa Helm do znalezienia pliku w bieżącym projekcie.Pocisk może budować twoje projekty.
C-c p c
uruchamia,projectile-compile-project
który próbuje uruchomić Make / SCons / CMake na podstawie dostępnych plików. Nigdy nie musiałem tego konfigurować; zawsze wiedział, co robić.Błędy pojawiają się we własnym buforze po uruchomieniu,
projectile-compile-project
ale nie jestem pewien, czy jest tak ładny, jak byś chciał.Możesz użyć pakietu,
helm-gtags
który łączy się zgtags
programem (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-dwim
można przejść do dowolnego użycia zmiennej lub funkcji, a po uruchomieniu w pliku nagłówkowym otwiera ten plik nagłówkowy.Jeszcze tego nie próbowałem.
Wymieniony przewodnik zawiera bardzo wyraźne informacje na temat konfiguracji, jak zacząć.
źródło
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 compile
jak 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 global
w powłoce i przeczytać instrukcję o zmiennej środowiskowej GTAGSLIBPATH. Istnieje wiele wtyczek do dostarczania ładnego UX opartego na Global do nawigacji kodu, polecam ggtags.elOdpowiedź 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.
źródło
CMakeLists.txt
?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 compile
intensywnie używam i wiążę klucze globalne z następnym i poprzednim błędem. Do wyszukiwania w „projektach” zazwyczaj używamM-x find-grep
. Pamiętaj, że użyje tych samych powiązań klawiszy dla następnego i poprzedniego błędu.źródło
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-file
otwarcie dowolnego pliku projektu. Ma wiele innych poleceń, które działają na podstawie projektu.Flycheck obsługuje sprawdzanie składni za pomocą clang / gcc.
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
źródło
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 recompile
uruchomienia ostatniego polecenia kompilacji, dzięki czemu możesz uruchomić kompilację po raz pierwszy, a następnie użyćrecompile
w dowolnym buforze.źródło
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.
źródło
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ł.
źródło
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.
źródło