Ответ 1
Чтобы избежать -e, вы можете использовать etags и с помощью find вы рекурсивно добавляете файл py:
find . -type f -name '*.py' | xargs etags
Есть ли эквивалент slime для python?
Например, если я помещаю курсор в foo() и делаю M-. (переход к определению) Я хотел бы видеть исходное определение функции foo
Это должно работать независимо от того, находится ли foo в
1) локальный каталог проекта
2) в некоторых ~/.virtualenvs/bar/lib/site-packages
3) в каком-то другом пути python
4) используется виртуальный env (т.е. он должен выглядеть в моем текущем virtualenv)
Использует ли комбинация pymacs/ropemacs?
Чтобы избежать -e, вы можете использовать etags и с помощью find вы рекурсивно добавляете файл 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 перейдет ко всем определениям тега. Тип C-u M-. чтобы перейти к следующему определению вашего тега. Для получения справки см. Документацию по поисковому метку. Проконсультируйтесь с 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
Также, если вы хотите включить идентификаторы из каталога виртуальных виртуальных сайтов (например: ~/.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