Особенность PyCharm, которую вы упомянули, была одной из моих любимых, и одной из первых вещей, которые я искал, пытаясь полностью заменить PyCharm на Emacs (что я рад сообщить, что смог сделать).
Как уже упоминалось в другом ответе, elpy
пакет имеет эту функцию (в дополнение ко многим другим полезным функциям IDE ). Однако, если вы используете elpy-goto-definition
поиск символа в точке, вы рано или поздно обнаружите, что в некоторых случаях, когда PyCharm сможет найти то, что вы ищете, elpy
не будет. Как говорят в документах:
Бэкэнды не всегда могут определить, какой символ находится в точке. Особенно после нескольких косвенных указаний, у них практически нет надежды угадать, поэтому они не
В этом случае вызов elpy-goto-definition
ничего не сделает и покажет небольшое сообщение об ошибке в области эха. Когда это происходит, конечно, вы все равно хотите найти то, что ищете, и elpy
это не оставляет вас в покое. В такой ситуации я всегда использую C-c C-s
( elpy-rgrep-symbol
) rgrep
для обозначения символа в любой точке моего проекта. По крайней мере, для меня то, что я ищу, более или менее всегда проявляется в rgrep
результатах. На самом деле, я думаю, что это похоже на то, что делает PyCharm: если вы попытаетесь найти определение чего-либо, а PyCharm не уверен, где оно определено, оно предложит вам выбрать из списка. Я на самом деле предпочитаю elpy
реализацию, потому что вместо временного списка, который исчезает при переходе к первому варианту,elpy-rgrep-symbol
оставит список возможностей открытым в другом буфере, чтобы при необходимости вы могли переходить между ними.
Поскольку мой рабочий процесс почти всегда заключается в первом вызове, elpy-goto-definition
а в случае сбоя - elpy-rgrep-symbol
я решил собрать вместе простую функцию, которая просто вызывает elpy-rgrep-symbol
автоматически в случае elpy-goto-definition
сбоя. Эта функция ниже:
(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)))))
Затем я связываю это с M-.
(привязка по умолчанию для elpy-goto-definition
).
(define-key elpy-mode-map (kbd "M-.") 'goto-def-or-rgrep)
Таким образом, я могу использовать одну из моих любимых функций PyCharm в моем любимом редакторе. Я знаю, что это довольно старый вопрос, и вы, возможно, уже решили эту проблему или пошли дальше, но я надеюсь, что вы или кто-то еще сочтете это полезным!
python-mode
что Emacs имеет по умолчанию. ( stackoverflow.com/questions/11363089/… )