Как я могу использовать мета-точку (M-) в python с emacs? - PullRequest
21 голосов
/ 17 августа 2010

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

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

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

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

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

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

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

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

Ответы [ 6 ]

14 голосов
/ 17 августа 2010

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

find . -type f -name '*.py' | xargs etags
8 голосов
/ 14 сентября 2015

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

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

M-x package-install elpy

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

$ sudo pip install rope jedi

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

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

4 голосов
/ 17 августа 2010

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

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

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

ctags -e -R .

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

3 голосов
/ 25 июня 2017

Принято ответ упускает важный момент, если вы выполните 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

2 голосов
/ 28 марта 2015

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

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
1 голос
/ 06 марта 2018

Попробуйте пакеты emacs 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-*, чтобы вернуться!

...