Jak używać Emacsa do wyszukiwania funkcji w Pythonie?

22

Jaki jest najłatwiejszy sposób skonfigurowania Emacsa, aby mógł wyszukiwać, gdzie zdefiniowano funkcję? Chcę go podświetlić w Emacsie i nacisnąć kombinację klawiszy, aby sprawdzić, gdzie jest źródło funkcji.

Czy możesz również dowiedzieć się, gdzie używana jest określona funkcja?

Można to łatwo zrobić w PyCharm, ale czy można to również łatwo zrobić w Emacsie?

Low Kian Seong
źródło

Odpowiedzi:

14

Próbowałeś Elpy ? Wiąże elpy-goto-definitionsię z kluczem M-..
Jeśli masz najnowszego Emacsa, myślę, że możesz także cofnąć się za pomocą xref-pop-marker-stack( M-,). Elpy ma również inne fajne funkcje.

Aby go zainstalować, postępuj zgodnie z instrukcjami w linku.

bmag
źródło
12

Używam trybu Jedi do Pythona i jestem z niego bardzo zadowolony. Nie tylko dokonuje dokładnego wyszukiwania wywołań funkcji, ale również rozwiązuje funkcje do poprawnej definicji, nawet w skomplikowanych sytuacjach (takich jak dziedziczenie). Pochodzi z funkcją auto-kompletacji do rozruchu. http://tkf.github.io/emacs-jedi/latest/

Achintya Sharma
źródło
8

Wspomniana funkcja PyCharm była jedną z moich ulubionych i jedną z pierwszych rzeczy, których szukałem, próbując całkowicie zastąpić PyCharm Emacsem (co z radością mogę powiedzieć, że mogłem to zrobić).

Jak wspomniano w innej odpowiedzi, elpypakiet ma tę funkcję (oprócz wielu innych przydatnych funkcji IDE ). Jednakże, jeśli użyjesz elpy-goto-definitiondo wyszukiwania symbolu w punkcie, prędzej czy później okaże się, że w niektórych przypadkach, w których PyCharm uda się znaleźć to, czego szukasz, elpynie. Jak mówią doktorzy:

backendy nie zawsze potrafią zidentyfikować, jakiego rodzaju symbol jest w punkcie. Zwłaszcza po kilku pośrednich interwencjach zasadniczo nie mają szans na zgadywanie, więc nie mają

W takim przypadku wywołanie elpy-goto-definitionnic nie da i wyświetli mały komunikat błędu w obszarze echa. Kiedy tak się dzieje, oczywiście nadal chcesz znaleźć to, czego szukasz, i elpynie pozostawia cię zawieszonego. W takiej sytuacji zawsze używam C-c C-s( elpy-rgrep-symbol) do rgrepoznaczenia symbolu w dowolnym projekcie, w którym jestem. Przynajmniej dla mnie rzecz, której szukam, mniej więcej pojawia się w rgrepwynikach. Właściwie myślę, że jest to podobne do tego, co robi PyCharm: jeśli spróbujesz sprawdzić definicję czegoś, a PyCharm nie jest pewny, gdzie to jest zdefiniowane, będziesz musiał wybrać z listy. Właściwie wolę elpyimplementację, ponieważ zamiast przejściowej listy, która znika po przejściu do pierwszej opcji,elpy-rgrep-symbol pozostawi listę możliwości otwartą w innym buforze, aby w razie potrzeby móc przeskakiwać między nimi.

Ponieważ moim przepływem pracy jest prawie zawsze pierwsze połączenie, elpy-goto-definitiona jeśli się nie powiedzie, zadzwoń elpy-rgrep-symbol, postanowiłem zhakować razem prostą funkcję, która po prostu wywołuje elpy-rgrep-symbolautomatycznie w przypadku elpy-goto-definitionniepowodzenia. Ta funkcja jest poniżej:

(defun goto-def-or-rgrep ()
  "Go to definition of thing at point or do an rgrep in project if that fails"
  (interactive)
  (condition-case nil (elpy-goto-definition)
    (error (elpy-rgrep-symbol (thing-at-point 'symbol)))))

Następnie powiążę to M-.(domyślne wiązanie dla elpy-goto-definition).

(define-key elpy-mode-map (kbd "M-.") 'goto-def-or-rgrep)

W ten sposób mogę użyć jednej z moich ulubionych funkcji PyCharm w moim ulubionym edytorze. Wiem, że to trochę stare pytanie i być może już rozwiązałeś ten problem lub przeszedłeś dalej, ale mam nadzieję, że ty lub ktoś inny okaże się przydatny!

Elethan
źródło
4

python-mode.el udostępnia polecenie py-find-definition- patrz w menu Pomoc.

Andreas Röhler
źródło
6
Zauważ, że należy zainstalować python-mode.el. To nie jest to, python-modeco Emacs ma domyślnie. ( stackoverflow.com/questions/11363089/… )
Brian Z
2

M- działa w trybie anakondy (do którego przełączyłem po problemach z elpy).

Zauważ, że potrzebujesz odpowiedniego środowiska Pythona, w moim przypadku wykonuję następujące czynności: - mkvirtualenv someenv - python setup.py developdla wszystkich modułów rozwijaj lub używaj (lub wolę dotrzeć do źródła zamiast wersji zainstalowanej) - M-x venv-workon someenvaby włączyć ścieżki w emacsie.

Następnie konfiguruję się, anaconda-modeaby być aktywnym za każdym razem, gdy edytuję Python i voila, M-.działa

Mekk
źródło
1

Dobre pytanie, które nie jest dostępne od razu po wyjęciu z pudełka i jest przydatną funkcją pełnych wersji IDE. Robię to cscopeza pomocą ładnego interfejsu steru:  http://wikemacs.org/wiki/Python#cscope Potrafi odpowiedzieć na pytania typu „gdzie jest zdefiniowany ten symbol? Gdzie jest używany?”.

ps: w trybie zła możemy przejść do definicji symbolu w tym samym pliku za pomocą gd.

Ehvince
źródło
Wierzę, że gdzło znajduje tylko pierwsze wystąpienie symbolu w pliku (pomimo dokumentu: „Przejdź do definicji lub pierwsze wystąpienie symbolu pod punktem”)
Gordon Gustafson
0

M-.który jest zobowiązany elpy-goto-definition, załatwi sprawę. Użycie M-*pozwoli ci wrócić do poprzedniej lokalizacji w buforze. Umożliwia to szybkie sprawdzenie czegoś i powrót do poprzedniej lokalizacji.

Używam również C-c C-oczęsto ( elpy-occur-definitions). Otworzy się okno z całą klasą, a funkcją jest bieżący bufor. Z tego bufora naciśnięcie Enterspowoduje wyświetlenie definicji w kodzie źródłowym.

użytkownik989762
źródło
W rzeczywistości AFAICT M-.jest domyślnie przypisany do dowolnego klawisza xref-find-definitionsi elpy-goto-definitionnie ma go (chociaż jest w menu). Znalezienie definicji w pakietach witryn wcale nie działa dobrze.
Robert P. Goldman
0

Jedi jest niesamowitą biblioteką autouzupełniania / analizy statycznej dla Pythona. Używałem jej bardzo często, kiedy korzystałem z vima.

Podobnie jak silnik autouzupełniania golang (tj. Gocode) działa zarówno dla vim, jak i emacs, ten sam silnik Jedi działa zarówno dla vim, jak i emacs .

phye
źródło