Comment utiliser Emacs pour rechercher une fonction en Python?


22

Quelle est la façon la plus simple de configurer Emacs pour pouvoir rechercher où une fonction est définie? Je veux le mettre en évidence dans Emacs et appuyer sur une combinaison de touches pour rechercher où se trouve la source de la fonction.

Pouvez-vous également savoir où une fonction spécifique est utilisée?

Cela se fait facilement dans PyCharm, mais peut-il aussi être fait facilement dans Emacs?

Réponses:


14

Avez-vous essayé Elpy ? Il se lie elpy-goto-definitionà la clé M-..
Si vous avez un Emacs récent, je pense que vous pouvez également revenir en arrière avec xref-pop-marker-stack( M-,). Elpy a également d'autres fonctionnalités intéressantes.

Pour l'installer, suivez les instructions du lien.


12

J'utilise le mode Jedi pour Python et j'en suis très content. Non seulement il effectue des recherches précises pour les appels de fonction, mais il résout les fonctions à la bonne définition même dans des situations compliquées (comme l'héritage). Livré avec auto complet pour démarrer. http://tkf.github.io/emacs-jedi/latest/


8

La fonctionnalité de PyCharm que vous mentionnez était l'une de mes préférées, et l'une des premières choses que j'ai recherchées en essayant de remplacer complètement PyCharm par Emacs (ce que je suis heureux de dire que j'ai pu le faire).

Comme mentionné dans une autre réponse, le elpypackage a cette fonctionnalité (en plus de nombreuses autres fonctionnalités IDE utiles ). Cependant, si vous utilisez elpy-goto-definitionpour rechercher le symbole au point, vous constaterez tôt ou tard que dans certains cas où PyCharm réussirait à trouver ce que vous cherchez, elpyne le fera pas. Comme le disent les docs:

les backends ne peuvent pas toujours identifier quel type de symbole est au point. Surtout après quelques indirections, ils n'ont pratiquement aucun espoir de deviner correctement, donc ils ne le font pas

Dans ce cas, l'invocation elpy-goto-definitionne fera rien et affichera un petit message d'erreur dans la zone d'écho. Lorsque cela se produit, bien sûr, vous voulez toujours trouver ce que vous cherchez et elpyne vous laissez pas pendre. Dans ce genre de situation, j'utilise toujours C-c C-s( elpy-rgrep-symbol) rgreppour le symbole au point dans n'importe quel projet dans lequel je suis. Au moins pour moi, la chose que je recherche apparaît plus ou moins toujours dans les rgreprésultats. En fait, je pense que cela est similaire à ce que PyCharm fait aussi: si vous essayez de rechercher la définition de quelque chose et que PyCharm n'est pas sûr de l'endroit où il est défini, vous devrez choisir dans une liste. En fait, je préfère elpyl'implémentation de, car plutôt qu'une liste transitoire qui disparaît lorsque vous passez à la première option,elpy-rgrep-symbol laissera la liste des possibilités ouverte dans un autre tampon afin que vous puissiez aller et venir entre eux si nécessaire.

Étant donné que mon flux de travail est presque toujours le premier appel elpy-goto-definitionet s'il échoue, appel elpy-rgrep-symbol, j'ai décidé de pirater ensemble une fonction simple qui n'appelle elpy-rgrep-symbolautomatiquement qu'en cas d' elpy-goto-definitionéchec. Cette fonction est ci-dessous:

(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)))))

Ensuite, je lie ceci à M-.(la liaison par défaut pour elpy-goto-definition).

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

De cette façon, je peux utiliser l'une de mes fonctionnalités PyCharm préférées dans mon éditeur préféré. Je sais que c'est une sorte de vieille question et vous avez peut-être déjà résolu ce problème ou vous êtes passé à autre chose, mais j'espère que vous ou quelqu'un d'autre le trouverez utile!



2

M-. fonctionne en mode anaconda (auquel je suis passé après avoir eu des problèmes avec elpy).

Notez que vous avez besoin d'un environnement python approprié, dans mon cas, je fais ce qui suit: - mkvirtualenv someenv - python setup.py developpour tous les modules à développer ou à utiliser (ou préfèrent atteindre la source plutôt que la version installée) - M-x venv-workon someenvpour activer les chemins dans emacs.

Ensuite, je configure anaconda-modepour être actif chaque fois que je modifie python et le tour est joué, M-.fonctionne


1

Bonne question, qui n'est pas disponible dès le départ et est une fonctionnalité pratique des IDE complets. Je le fais avec cscope, avec une belle interface de barre:  http://wikemacs.org/wiki/Python#cscope Il peut répondre à des questions comme "où ce symbole est-il défini? Où est-il utilisé?".

ps: en mode diabolique on peut aller à la définition d'un symbole dans le même fichier avec gd.


Je crois gdque le mal ne trouve que la première occurrence du symbole dans le fichier (malgré la docstring: "Aller à la définition ou la première occurrence du symbole sous le point.")
Gordon Gustafson

0

M-.qui elpy-goto-definitionne manquera pas de faire l'affaire. L'utilisation M-*vous permettra de revenir à l'emplacement précédent dans le tampon. Cela vous permet de vérifier rapidement quelque chose et de revenir à l'emplacement précédent.

J'utilise aussi C-c C-osouvent ( elpy-occur-definitions). Cela ouvrira une fenêtre avec toutes les classes et la fonction est le tampon actuel. À partir de ce tampon, appuyez Entersur vous atterrira sur la définition dans le code source.


En fait, AFAICT M-.est lié à xref-find-definitionset elpy-goto-definitionn'est sur aucune touche par défaut (bien qu'il soit dans les menus). La recherche de définitions dans les packages de sites ne semble pas du tout fonctionner correctement.
Robert P. Goldman,

0

Jedi est une impressionnante bibliothèque d'auto-complétion / analyse statique pour Python, je l'ai beaucoup utilisée lorsque j'utilisais vim.

Tout comme le moteur d'auto-complétion golang (c'est-à-dire gocode) fonctionne à la fois pour vim et emacs, le même moteur Jedi fonctionne à la fois pour vim et emacs .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.