Czy obsługa emacsa może przejść do deklaracji funkcji w całym projekcie?

12

Czy emacs ma funkcję lub bibliotekę, która pozwala użytkownikowi przejść do deklaracji funkcji, nawet jeśli została zdefiniowana w innym pliku?

Jeśli tak, jakie języki są obsługiwane?

Inspiracja do tego pytania pochodzi z poniższego artykułu, który mówi o niektórych przyczynach, dla których emacs nigdy nie będzie w stanie konkurować z IDE.

http://henrikwarne.com/2012/06/17/programmer-productivity-emacs-versus-intellij-idea/

użytkownik2522280
źródło
Sposób, w jaki emacs na ogół sobie z tym radzi, polega na zewnętrznych kompilowanych programach (takich jak clang), aby szybko zrozumieć kod źródłowy i odpowiedzieć na zapytania przekazywane za pomocą wiersza poleceń. Sprawdź w irony-clangtym celu. Czy czytałeś komentarze do artykułu?
Sean Allred
1
Funkcje dostarczone przez alchemist.el, dla eliksiru, lub omnisharp dla C #, oba oparte na zewnętrznych programach do nawigacji / refaktoryzacji / ide-ish, są bardzo podobne do większości IDE. (przynajmniej w większości przypadków użycia). Emacs nie działa w tym samym biznesie co IDE, więc nie sądzę, że rozsądnie jest powiedzieć, że nigdy nie będzie miał konkurencyjnej szansy.
Renan Ranelli
@RenanRanelli IDE jest po prostu taki sam, z tym wyjątkiem, że musimy przeprowadzić integrację ręcznie zamiast kogoś, kto już to zrobił i nazwał to „IDE”.
Tu Do
Moim zdaniem w 2019 r. Należy rozważyć tylko jedno rozwiązanie. I to wszystko po ukończeniu firmy. Zapomnij o etagach lub nadęty, niestabilny CEDET. rtags używa informacji o czasie kompilacji, aby dostarczyć LIVE strukturę tego, czego używa twój projekt. global i wsp. są okropni - są uwielbianymi „grepsami”, którzy często zgadują i często zabierają cię w złe miejsce. github.com/Andersbakken/rtags
RichieHH

Odpowiedzi:

14

Możesz przejść do dowolnej definicji / referencji całego projektu tak dużej jak drzewo źródeł jądra Linux (ponad 36k) w jednej chwili. Szczegółowe informacje można znaleźć w moim przewodniku C / C ++ . W przypadku C / C ++ sugeruję użycie GNU Global, który obsługuje C, C ++, Yacc, Java, PHP4 i asembler.

Kluczem jest to, że jeśli chcesz mieć funkcje IDE języka, musisz zainstalować wtyczkę tego języka. Oto kilka pakietów dla dynamicznych języków, które znam:

  • Tworzenie stron internetowych na żywo: tryb szpikulca .
  • JavaScript: rybitwa . Ale przedtem pamiętaj, aby zainstalować tryb js2 . Co do tego js2-mode, zobacz opis ; ale w gruncie rzeczy js2-modejest to kompletny parser JavaScript, który generuje AST w celu wykonania odpowiednich funkcji IDE. Jeśli zainstalujesz skewer-mode, będziesz miał js2-modedomyślnie, ponieważ skewer-modezależy od tego.
  • Python: elpy , zobacz funkcje IDE
  • Ruby: robe zapewnia następujące funkcje:
  • Przejdź do definicji metody
  • Przejdź do super lub konstruktora wywoływanego w punkcie
  • Przejdź do modułu lub klasy (pod warunkiem, że zdefiniowano co najmniej jedną metodę)
  • Wyświetl dokumentację metody
  • Wyświetl informacje o metodzie wywoływanej w punkcie przy użyciu ElDoc
  • Metoda i ciągłe uzupełnianie nazw

Możesz także użyć ctagsdo obsługi wielu języków, takich jak skrypt powłoki lub Tcl ...

Do zrobienia
źródło
Wszelkie sugestie dotyczące pakietu JavaScript?
user2522280,
@BarryG Jest Tern i j2-modeja zredagowałem w mojej odpowiedzi.
Tu Do
2
Chciałbym wskazać, że anacondamoże to być bardziej szczegółowe rozwiązanie do przeskakiwania definicji w Pythonie.
PythonNut,
@TuDo Umieściłeś listę funkcji Robe'a w ESS.
Dmitry
W przypadku C ++ istnieją również rtags i ycmd . Używam ycmd, który działa również z np. Python, C #, Go i innymi językami. Używam dumb-jump i counsell-rg jako źródła rezerwowego lub w celu pokazania zwyczajów lub komentarzy / dokumentów o symbolu.
młot
20

Miałem podobny problem z emacsem, więc zrobiłem Dumb Jump . Wypróbowałem wiele rozwiązań wymienionych w zaakceptowanej odpowiedzi, ale zawsze napotkałem jeden lub więcej z następujących problemów:

  • Rozwiązanie działało tylko dla jednego języka programowania
  • Rozwiązanie wymagało pliku indeksu (TAG) lub trwałego procesu

Bardzo chciałem rozwiązania, które „po prostu działało” i nie wymagało dostosowywania ani konfiguracji. To znaczy, chciałem sklonować losowe repozytorium na Github i poruszać się po nim jak w przypadku innych moich własnych projektów.

W tej chwili Dumb Jump ma podstawowe wsparcie dla:

  • JavaScript
  • Emacs Lisp
  • Pyton
  • Udać się
  • PHP
  • Rubin
  • Faust
  • R
  • Lua
  • Rdza
  • ...i więcej

Jest dostępny za pośrednictwem MELPA i GitHub, a PR są mile widziane.

Jacek
źródło
4

Podstawowym rozwiązaniem tego problemu w emacs jest użycie plików TAGS, które są tworzone przez programy takie jak etags lub gtags. Sam używam (i polecam) bujnych tagów i etags-select.el, aby pomóc ci zawęzić cele, gdy symbol wyszukiwania znajduje się w wielu miejscach docelowych. Obsługiwane języki są dość liczne, patrz instrukcje poszczególnych narzędzi. Istnieje nawet obsługa dodawania własnego języka, dzięki czemu możesz podać wyrażenie regularne, które instruuje ctags, jak izolować interesujące Cię tagi.

InHarmsWay
źródło
1
O! Jak mogę zapomnieć o plikach tagów? ctags -e -R *z katalogu głównego skonfiguruję go dla Ciebie.
Sean Allred
czy jest to akceptowalne rozwiązanie, gdy twój projekt ma wiele zależności (takich jak nowsze projekty Java Web Dev Dev)?
Rudolf Olah,
Liczba zależności nie jest sama w sobie przeszkodą. Możesz mieć jeden duży plik znaczników, który agreguje wiele różnych bibliotek; Robiłem to przez wiele lat, inwokacja polecenia ctags robi to trywialnie. Lub to, co teraz polecam, to mieć osobny plik znaczników dla zależności; emacs jest wystarczająco inteligentny, aby załadować wiele plików znaczników. Aby to ułatwić, wyszukaj plik etags-table.el, który pomaga ładować grupy plików znaczników na projekt.
InHarmsWay