Как я могу использовать мета-точку (M-.) В Python с Emacs?

Есть ли эквивалент слизи для питона?

Например, если я наведу курсор на foo() и сделаю M-. (перейти к определению) Я хотел бы увидеть исходное определение функции foo

Это должно работать независимо от того, находится ли foo в

1) локальный каталог проектов

2) в некоторых ~ /.virtualenvs / bar / lib / site-packages

3) в каком-то другом питон-пути

4) используется виртуальный env (то есть, он должен выглядеть в моем текущем virtualenv)

Делает ли что-нибудь из этого комбинация pymacs / ropemacs?

6 ответов

Решение

Чтобы избежать -e, вы можете использовать etags и рекурсивно добавить к нему файл py:

find . -type f -name '*.py' | xargs etags

Большинство ответов, упомянутых здесь, устарели. Простое решение - использовать elpy для M-. без etags (что требует дополнительной работы).

Установите elpy, как упомянуто здесь.

M-x package-install elpy

а затем установить пакеты Python

$ sudo pip install rope jedi

Перезапустите emacs, откройте любой файл python и запустите M-.

Elpy полностью задокументирована, вы можете прочитать о M-. здесь

M-. нормально запускаетсяfind-tag"функция. Вы должны создать файл TAGS из ваших исходных файлов Python. Тогда вы"visit-tags-table"перед выполнением M-. Таким образом, Emacs будет переходить ко всем определениям тега. Введите Cu M-., чтобы перейти к следующему определению вашего тега. См. справку по документации по тегам find. Для получения справки обратитесь к справке Emacs. создать файл TAGS из исходных файлов Python.

Например, вы можете использовать Exuberant Ctags для создания файла TAGS.

Перейдите в корневой каталог ваших файлов Python и сделайте это:

ctags -e -R .

Файл TAGS обычно создается в корневом каталоге проекта.

Следующее будет индексировать ваш текущий проект

find . -type f -name '*.py' | xargs etags

Но если вы хотите проиндексировать ваши импортированные библиотеки. Вы сначала активируете свой virtualenv. Тогда используйте which Python, чтобы определить, где находятся ваши библиотеки, а затем направить их в etags.

workon my-project # if using virtualenvwrappwer
source bin/activate # if using virtualenv

find ${$(which python)/\/bin\/python/} -type f -name '*.py' | xargs etags

Принятый ответ упускает важный момент, если вы выполняете etags лайк find . -type f -name '*.py' | xargs etags тогда файл TAGS будет генерироваться каждый раз для каждого файла.

Правильный способ сделать это - добавить данные в существующий файл TAGS с помощью --append лайк

rm -f TAGS
find . -type f -name '*.py' -print0 | xargs -0 etags --append

Также, если вы хотите включить идентификаторы из виртуальных пакетов env site dir (например: ~/.virtualenvs/bar/lib/site-packages):

SITEPACKAGES=$(cdvirtualenv;pwd)/lib/python3.6/site-packages/
find $SITEPACKAGES -type f -name '*.py' -print0 | xargs -0 etags -a

* настроить python3.6 к вашей текущей версии Python

Попробуйте пакеты eaccs anaconda-mode и company-anaconda. Обновить конфиг:

(eval-after-load "company"
 '(add-to-list 'company-backends 'company-anaconda))
(add-hook 'python-mode-hook 'anaconda-mode)
(add-hook 'python-mode-hook 'company-mode)

Переключитесь на virtualenv с помощью pythonic-activate, если у тебя есть.

Теперь у вас есть M-. и вы можете нажать M-* идти обратно!

Другие вопросы по тегам