Как я могу использовать meta-dot (M-.) В python с emacs?

Есть ли эквивалент slime для python?

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

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

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

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

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

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

Использует ли комбинация pymacs/ropemacs?

Ответы

Ответ 1

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

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

Ответ 2

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

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

M-x package-install elpy

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

$ sudo pip install rope jedi

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

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

Ответ 3

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

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

Перейдите в корневой каталог ваших файлов python и выполните следующее:

ctags -e -R .

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

Ответ 4

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

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

Ответ 5

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

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

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

Также, если вы хотите включить идентификаторы из каталога виртуальных виртуальных сайтов (например: ~/.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