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, elpy
pakiet ma tę funkcję (oprócz wielu innych przydatnych funkcji IDE ). Jednakże, jeśli użyjesz elpy-goto-definition
do 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, elpy
nie. 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-definition
nic 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 elpy
nie pozostawia cię zawieszonego. W takiej sytuacji zawsze używam C-c C-s
( elpy-rgrep-symbol
) do rgrep
oznaczenia symbolu w dowolnym projekcie, w którym jestem. Przynajmniej dla mnie rzecz, której szukam, mniej więcej pojawia się w rgrep
wynikach. 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ę elpy
implementację, 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-definition
a jeśli się nie powiedzie, zadzwoń elpy-rgrep-symbol
, postanowiłem zhakować razem prostą funkcję, która po prostu wywołuje elpy-rgrep-symbol
automatycznie w przypadku elpy-goto-definition
niepowodzenia. 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!
python-mode
co Emacs ma domyślnie. ( stackoverflow.com/questions/11363089/… )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 develop
dla wszystkich modułów rozwijaj lub używaj (lub wolę dotrzeć do źródła zamiast wersji zainstalowanej) -M-x venv-workon
someenv
aby włączyć ścieżki w emacsie.Następnie konfiguruję się,
anaconda-mode
aby być aktywnym za każdym razem, gdy edytuję Python i voila,M-.
działaźródło
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
cscope
za 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
.źródło
gd
zło znajduje tylko pierwsze wystąpienie symbolu w pliku (pomimo dokumentu: „Przejdź do definicji lub pierwsze wystąpienie symbolu pod punktem”)M-.
który jest zobowiązanyelpy-goto-definition
, załatwi sprawę. UżycieM-*
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-o
często (elpy-occur-definitions
). Otworzy się okno z całą klasą, a funkcją jest bieżący bufor. Z tego bufora naciśnięcieEnter
spowoduje wyświetlenie definicji w kodzie źródłowym.źródło
M-.
jest domyślnie przypisany do dowolnego klawiszaxref-find-definitions
ielpy-goto-definition
nie ma go (chociaż jest w menu). Znalezienie definicji w pakietach witryn wcale nie działa dobrze.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 .
źródło