Як використовувати Emacs для пошуку функції в Python?


22

Який найпростіший спосіб налаштувати Emacs, щоб можна було шукати там, де визначена функція? Я хочу виділити це в Emacs і натиснути комбінацію клавіш, щоб шукати, де знаходиться джерело функції.

Чи можете ви також дізнатися, де використовується певна функція?

Це легко зробити в PyCharm, але чи можна це зробити легко і в Emacs?

Відповіді:


14

Ви пробували Елпі ? Він прив’язується elpy-goto-definitionдо ключа M-..
Якщо у вас є нещодавній Emacs, я думаю, ви також можете відскочити назад xref-pop-marker-stack( M-,). Elpy має і деякі інші приємні риси.

Щоб встановити його, дотримуйтесь інструкцій за посиланням.


12

Я використовую режим Jedi для Python, і я дуже задоволений цим. Він не тільки робить точні пошуки функціональних викликів, але розв'язує функції за правильним визначенням навіть у складних ситуаціях (наприклад, успадкування). До завантаження входить автоматичне завершення. http://tkf.github.io/emacs-jedi/latest/


8

Особливість PyCharm, яку ви згадуєте, була однією з моїх улюблених і одна з перших речей, яку я шукав, намагаючись повністю замінити PyCharm Emacs (що я радий сказати, що міг зробити).

Як було сказано в іншій відповіді, elpyпакет має цю особливість (на додаток до багатьох інших корисних функцій IDE ). Однак якщо ви elpy-goto-definitionшукаєте символ у точці, ви рано чи пізно виявите, що в деяких випадках, коли PyCharm вдасться знайти те, що ви шукаєте, elpyне буде. Як кажуть документи:

мітки не завжди можуть ідентифікувати, який символ є в точці. Особливо після кількох непрямих, вони в основному не сподіваються здогадатися правильно, так що вони не роблять

У цьому випадку виклик elpy-goto-definitionнічого не зробить і покаже невелике повідомлення про помилку в області ехо. Коли це відбувається, звичайно, ви все одно хочете знайти те, що шукаєте, і elpyне залишає вас повішеним. У такій ситуації я завжди використовую C-c C-s( elpy-rgrep-symbol) rgrepдля символу в будь-якому проекті, в якому я перебуваю. Принаймні для мене, те, що я шукаю, більш-менш завжди виявляється в rgrepрезультатах. Насправді, я думаю, що це схоже на те, що робить і PyCharm: якщо ви спробуєте знайти визначення чогось, і PyCharm не знає, де це визначено, ви виберете його зі списку. Я насправді віддаю перевагу elpyреалізації, тому що замість перехідного списку, який зникає, коли ви переходите до першого варіанту,elpy-rgrep-symbol залишить список можливостей відкритим в іншому буфері, щоб ви могли стрибати між ними вперед і назад.

Оскільки мій робочий процес майже завжди є першим, elpy-goto-definitionі якщо він не працює, дзвоніть elpy-rgrep-symbol, я вирішив зламати просту функцію, яка просто дзвонить elpy-rgrep-symbolавтоматично, якщо elpy-goto-definitionне працює. Ця функція знаходиться нижче:

(defun goto-def-or-rgrep ()
  "Go to definition of thing at point or do an rgrep in project if that fails"
  (interactive)
  (condition-case nil (elpy-goto-definition)
    (error (elpy-rgrep-symbol (thing-at-point 'symbol)))))

Потім я пов'язую це M-.(прив'язка за замовчуванням для elpy-goto-definition).

(define-key elpy-mode-map (kbd "M-.") 'goto-def-or-rgrep)

Таким чином я можу використовувати одну з улюблених функцій PyCharm у своєму улюбленому редакторі. Я знаю, що це якесь старе питання, і ви, можливо, вже вирішили цю проблему або продовжили роботу, але сподіваюся, ви чи хтось інший вважає це корисним!



2

М-. працює в анакондовому режимі (до якого я перейшов після проблем з елпі).

Зауважте, що вам потрібне належне середовище python, в моєму випадку я роблю наступне: - mkvirtualenv someenv - python setup.py developдля всіх модулів розробляються або використовуються (або віддають перевагу досягати джерела замість встановленої версії) - M-x venv-workon someenvдля включення шляхів у emacs.

Тоді я налаштовую anaconda-modeбути активним, коли я редагую python і voila, M-.працює


1

Хороший запитання, що він недоступний у вікні, і це зручна функція повних роздутих IDE. Я роблю це з cscopeприємним інтерфейсом керма:  http://wikemacs.org/wiki/Python#cscope Він може відповідати на запитання типу "де визначений цей символ? Де він використовується?".

ps: у злому режимі ми можемо перейти до визначення символу у тому самому файлі gd.


Я вірю gdв зло лише знаходить перше виникнення символу у файлі (незважаючи на докстринг: "Перейдіть до визначення або першої зустрічі символу під точкою")
Гордон Густафсон

0

M-.який обов'язково elpy-goto-definitionзробить трюк. Використання M-*дозволить вам перейти назад до попереднього місця в буфер. Це дозволяє швидко щось перевірити і повернутися до попереднього місця.

Я також C-c C-oчасто використовую ( elpy-occur-definitions). Це відкриє вікно з усім класом і функцією є поточний буфер. З цього буфера натискання Enterназначить вам визначення у вихідному коді.


Насправді, AFAICT, M-.прив’язаний до нього xref-find-definitionsта elpy-goto-definitionне має жодної клавіші за замовчуванням (хоча це в меню). Знаходження визначень у пакунках сайтів, схоже, не працює.
Роберт П. Голдман

0

Джедай - це дивовижна бібліотека автозавершення / статичного аналізу для Python. Я багато використовував його, коли я використовував vim.

Так само, як двигун автодоповнення golang (тобто gocode) працює як для vim, так і для emacs, той же движок Jedi працює як для vim, так і для emacs .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.