Особенность 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/… )M-. работает в режиме анаконды (к которому я переключился после проблем с elpy).
Обратите внимание , что вам нужно правильное окружение питона, в моем случае я делаю следующее: -
mkvirtualenv someenv
-python setup.py develop
для всех модулей разработки или использования (или предпочитают , чтобы достичь источника вместо установленной версии) -M-x venv-workon
someenv
для того, чтобы пути в Emacs.Затем я настраиваю,
anaconda-mode
чтобы быть активным всякий раз, когда я редактирую python и вуаля,M-.
работаетисточник
Хороший вопрос, который не доступен из коробки и является удобной функцией полноценных IDE. Я делаю это с
cscope
помощью приятного интерфейса руля: http://wikemacs.org/wiki/Python#cscope. Он может отвечать на вопросы типа «где определяется этот символ? Где он используется?».PS: в режиме зла мы можем перейти к определению символа в том же файле с
gd
.источник
gd
в то, что зло находит только первое вхождение символа в файле (несмотря на строку документации: «Перейти к определению или первому вхождению символа под точкой».)M-.
который обязательноelpy-goto-definition
сделает свое дело. ИспользованиеM-*
позволит вам вернуться к предыдущему месту в буфере. Это позволяет быстро что-то проверить и вернуться к предыдущему местоположению.Я также
C-c C-o
часто использую (elpy-occur-definitions
). Это откроет окно со всем классом и функцией текущего буфера. Из этого буфера нажатиеEnter
приведет вас к определению в исходном коде.источник
M-.
привязанxref-find-definitions
иelpy-goto-definition
не находится ни на одной клавише (хотя он есть в меню). Поиск определений в пакетах сайта, кажется, не работает вообще.Jedi - это потрясающая библиотека автозаполнения / статического анализа для Python. Я много использовал ее, когда использовал vim.
Так же, как механизм автозаполнения golang (т.е. gocode) работает как для vim, так и для emacs, тот же механизм Jedi работает и для vim, и для emacs .
источник