Как я могу использовать мета-точку (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-*
идти обратно!