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/… )