Le support emacs peut-il aller à la déclaration de fonction dans un projet entier?

12

Emacs a-t-il une fonction ou une bibliothèque qui peut permettre à l'utilisateur d'accéder à la déclaration de fonction même si elle a été définie dans un autre fichier?

Si oui, pour quelles langues est-il pris en charge?

L'inspiration pour cette question vient de l'article ci-dessous qui parle de certaines des raisons pour lesquelles emacs ne pourra jamais rivaliser avec les IDE.

http://henrikwarne.com/2012/06/17/programmer-productivity-emacs-versus-intellij-idea/

user2522280
la source
La manière dont emacs gère généralement cela est de s'appuyer sur des programmes externes compilés (comme clang) pour comprendre rapidement le code source et répondre aux requêtes transmises via la ligne de commande. Découvrez irony-clangà cette fin. Avez-vous lu les commentaires sur l'article?
Sean Allred
1
Les fonctionnalités fournies par alchemist.el, pour elixir, ou omnisharp pour C #, qui reposent toutes deux sur des programmes externes pour la navigation / refactoring / ide-ish, sont assez similaires à la plupart des IDE. (au moins pour la plupart des cas d'utilisation). Emacs n'est pas dans le même domaine que les IDE, donc je ne pense pas qu'il soit raisonnable de dire qu'il n'aura jamais de chance concurrentielle.
Renan Ranelli
@RenanRanelli IDE est exactement de la même manière, sauf que nous devons faire l'intégration manuellement au lieu que quelqu'un l'ait déjà fait et l'a appelé un "IDE".
Tu Do
EN 2019, il n'y a qu'une seule solution que vous devriez considérer à mon avis. Et c'est rtags avec l'achèvement de l'entreprise. Oubliez les étiquettes ou le CEDET gonflé et instable. rtags utilise des informations de compilation pour fournir une structure LIVE de ce que votre projet utilise. global et al sont horribles - ce sont des "greps" glorifiés qui font beaucoup de suppositions et vous emmènent souvent au mauvais endroit. github.com/Andersbakken/rtags
RichieHH

Réponses:

14

Vous pouvez passer à n'importe quelle définition / référence de projet entier aussi grand que l'arbre source du noyau Linux (plus de 36k) en un instant. Voir mon guide C / C ++ pour plus de détails. Pour C / C ++, je suggère d'utiliser GNU Global qui prend en charge C, C ++, Yacc, Java, PHP4 et l'assemblage.

La clé est, si vous voulez avoir des fonctionnalités IDE d'une langue, vous devez installer le plugin de cette langue. Voici quelques packages pour les langages dynamiques que je connais:

  • Développement Web en direct: mode brochette .
  • Javascript: Sterne . Mais avant cela, n'oubliez pas d'installer le mode js2 . Quant à ce qui js2-modefait, voir la description ; mais en substance, js2-modec'est un analyseur Javascript complet qui génère un AST pour faire les fonctionnalités IDE appropriées. Si vous installez skewer-modeque vous aurez js2-modepar défaut, car cela skewer-modedépend.
  • Python: elpy , voir les fonctionnalités IDE
  • Ruby: robe offre les fonctionnalités suivantes:
  • Aller à la définition de méthode
  • Aller à super ou à un constructeur appelé au point
  • Aller à un module ou une classe (à condition qu'il ait au moins une méthode définie)
  • Documentation de la méthode d'affichage
  • Afficher des informations sur la méthode appelée au point à l'aide d'ElDoc
  • Méthode et complétion constante du nom

Vous pouvez également utiliser ctagspour prendre en charge de nombreux langages tels que le script shell ou Tcl ...

Tu Do
la source
Une suggestion de suite pour javascript?
user2522280
@BarryG Il y a Tern et j2-modej'ai édité dans ma réponse.
Tu Do
2
Je voudrais souligner que cela anacondapeut être une solution plus spécifique pour le saut de définition en Python.
PythonNut
@TuDo Vous avez mis la liste des fonctionnalités de Robe sous ESS.
Dmitry
Pour C ++, il y a aussi rtags et ycmd . J'utilise ycmd, qui fonctionne également avec par exemple Python, C #, Go et d'autres langages. J'utilise le saut-muet et le conseil-rg comme solution de rechange ou pour montrer les usages ou les mentions commentées / documentées d'un symbole.
unhammer
18

J'ai rencontré un problème similaire avec emacs, alors j'ai créé Dumb Jump . J'ai essayé de nombreuses solutions mentionnées dans la réponse acceptée, mais j'ai toujours rencontré un ou plusieurs des problèmes suivants:

  • La solution ne fonctionnait que pour un seul langage de programmation
  • La solution nécessitait un fichier d'index (TAG) ou un processus persistant

Je voulais vraiment une solution qui "marchait juste" et ne nécessitait ni personnalisation ni configuration. Autrement dit, je voulais cloner un dépôt aléatoire sur Github et naviguer autour de lui comme n'importe quel autre de mes propres projets.

À l'heure actuelle, Dumb Jump a un support de base pour:

  • Javascript
  • Emacs Lisp
  • Python
  • Aller
  • PHP
  • Rubis
  • Faust
  • R
  • Lua
  • Rouille
  • ...et plus

Il est disponible via les numéros MELPA et GitHub et les RP sont plus que bienvenus.

Jack
la source
4

La principale solution pour cela dans emacs utilise des fichiers TAGS, qui sont créés par des programmes tels que etags ou gtags. J'utilise moi-même (et recommande) des ctags exubérants et etags-select.el pour vous aider à affiner les destinations lorsque le symbole de recherche se trouve dans plusieurs destinations. Les langues prises en charge sont assez nombreuses, voir les manuels des outils individuels. Il est même possible d'ajouter votre propre langue, grâce à laquelle vous pouvez fournir une expression régulière qui indique aux ctags comment isoler les balises qui vous intéressent.

InHarmsWay
la source
1
Oh! Comment pourrais-je oublier les fichiers de tags? ctags -e -R *à partir du répertoire racine le configurera pour vous.
Sean Allred
est-ce une solution acceptable lorsque votre projet a de nombreuses dépendances (comme des projets de développement Web javascript plus récents)?
Rudolf Olah
Le nombre de dépendances n'est pas en soi un obstacle. Vous pouvez soit avoir un grand fichier de balises qui regroupe de nombreuses bibliothèques différentes; Je l'ai fait pendant de nombreuses années, l'invocation de la commande ctags le fait trivialement. Ou ce que je recommande maintenant, c'est d'avoir un fichier de balises distinct par dépendance; emacs est assez intelligent pour charger plusieurs fichiers de balises. Pour faciliter cela, recherchez etags-table.el, qui permet de charger des groupes de fichiers de balises par projet.
InHarmsWay