Как использовать Emacs для поиска функции в Python?

22

Какой самый простой способ настроить Emacs, чтобы он мог искать, где определена функция? Я хочу выделить его в Emacs и нажать комбинацию клавиш, чтобы посмотреть, где находится источник функции.

Вы также можете узнать, где используется определенная функция?

Это легко сделать в PyCharm, но можно ли это сделать в Emacs?

Низкий Киан Сон
источник

Ответы:

14

Вы пробовали Elpy ? Это связывает elpy-goto-definitionс ключом M-..
Если у вас есть недавний Emacs, я думаю, что вы также можете вернуться назад с xref-pop-marker-stack( M-,). У Elpy есть и другие приятные особенности.

Чтобы установить его, следуйте инструкциям в ссылке.

bmag
источник
12

Я использую режим джедая для Python, и я очень доволен им. Он не только выполняет точный поиск вызовов функций, но и разрешает функции до правильного определения даже в сложных ситуациях (например, при наследовании). Поставляется с автозаполнением для загрузки. http://tkf.github.io/emacs-jedi/latest/

Ачинтя Шарма
источник
8

Особенность 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 в моем любимом редакторе. Я знаю, что это довольно старый вопрос, и вы, возможно, уже решили эту проблему или пошли дальше, но я надеюсь, что вы или кто-то еще сочтете это полезным!

elethan
источник
4

Команда python-mode.el предоставляет команду py-find-definition- см. в меню Справка.

Андреас Рёлер
источник
6
Обратите внимание, что python-mode.el должен быть установлен. Это не то, python-modeчто Emacs имеет по умолчанию. ( stackoverflow.com/questions/11363089/… )
Брайан З.
2

M-. работает в режиме анаконды (к которому я переключился после проблем с elpy).

Обратите внимание , что вам нужно правильное окружение питона, в моем случае я делаю следующее: - mkvirtualenv someenv - python setup.py developдля всех модулей разработки или использования (или предпочитают , чтобы достичь источника вместо установленной версии) - M-x venv-workon someenvдля того, чтобы пути в Emacs.

Затем я настраиваю, anaconda-modeчтобы быть активным всякий раз, когда я редактирую python и вуаля, M-.работает

Мекк
источник
1

Хороший вопрос, который не доступен из коробки и является удобной функцией полноценных IDE. Я делаю это с cscopeпомощью приятного интерфейса руля:  http://wikemacs.org/wiki/Python#cscope. Он может отвечать на вопросы типа «где определяется этот символ? Где он используется?».

PS: в режиме зла мы можем перейти к определению символа в том же файле с gd.

Ehvince
источник
Я верю gdв то, что зло находит только первое вхождение символа в файле (несмотря на строку документации: «Перейти к определению или первому вхождению символа под точкой».)
Гордон Густафсон,
0

M-.который обязательно elpy-goto-definitionсделает свое дело. Использование M-*позволит вам вернуться к предыдущему месту в буфере. Это позволяет быстро что-то проверить и вернуться к предыдущему местоположению.

Я также C-c C-oчасто использую ( elpy-occur-definitions). Это откроет окно со всем классом и функцией текущего буфера. Из этого буфера нажатие Enterприведет вас к определению в исходном коде.

user989762
источник
На самом деле, AFAICT, по умолчанию M-.привязан xref-find-definitionsи elpy-goto-definitionне находится ни на одной клавише (хотя он есть в меню). Поиск определений в пакетах сайта, кажется, не работает вообще.
Роберт П. Голдман
0

Jedi - это потрясающая библиотека автозаполнения / статического анализа для Python. Я много использовал ее, когда использовал vim.

Так же, как механизм автозаполнения golang (т.е. gocode) работает как для vim, так и для emacs, тот же механизм Jedi работает и для vim, и для emacs .

phye
источник