Il supporto di emacs può andare alla dichiarazione di funzione in un intero progetto?


12

Emacs ha una funzione o libreria che può consentire all'utente di andare alla dichiarazione di funzione anche se è stata definita in un altro file?

In tal caso, per quali lingue è supportato?

L'ispirazione per questa domanda, proviene dall'articolo di seguito che parla di alcuni dei motivi per cui emacs non sarà mai in grado di competere con gli IDE.

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


Il modo in cui emacs generalmente gestisce ciò è affidandosi a programmi compilati esterni (come clang) per comprendere rapidamente il codice sorgente e rispondere alle query passate dalla riga di comando. Dai un'occhiata irony-clanga questo scopo. Hai letto i commenti sull'articolo?
Sean Allred,

1
Le funzionalità fornite da alchemist.el, per elisir o omnisharp per C #, entrambe basate su programmi esterni per la navigazione / refactoring / roba ide-ish, sono molto simili alla maggior parte degli IDE in circolazione. (almeno per la maggior parte dei casi d'uso). Emacs non fa parte degli IDE, quindi non credo sia ragionevole affermare che non avrà mai una possibilità concorrenziale.
Renan Ranelli,

@RenanRanelli IDE è esattamente allo stesso modo, tranne per il fatto che dobbiamo fare l'integrazione manualmente invece che qualcuno l'ha già fatto e lo ha chiamato "IDE".
Tu Do

Nel 2019 c'è solo una soluzione che dovresti considerare a mio avviso. E questo è log con il completamento dell'azienda. Dimentica gli etags o il CEDET gonfio e instabile. rtags usa le informazioni in fase di compilazione per fornire una struttura LIVE di ciò che il tuo progetto sta usando. global et al. sono orribili: sono "greps" glorificati che fanno molte congetture e spesso ti portano nel posto sbagliato. github.com/Andersbakken/rtags
RichieHH

Risposte:


14

Puoi passare a qualsiasi definizione / riferimento dell'intero progetto grande quanto l'albero dei sorgenti del kernel Linux (più di 36k) in un istante. Vedi la mia guida C / C ++ per i dettagli. Per C / C ++, suggerisco di usare GNU Global che supporta C, C ++, Yacc, Java, PHP4 e assembly.

La chiave è, se si desidera avere le funzionalità IDE di una lingua, è necessario installare il plugin di quella lingua. Ecco alcuni pacchetti per linguaggi dinamici che conosco:

  • Sviluppo web live: modalità spiedino .
  • Javascript: sterna . Ma prima, ricordati di installare js2-mode . Per quanto riguarda ciò che js2-modefa, vedere la descrizione ; ma in sostanza, js2-modeè un parser Javascript completo che genera un AST per eseguire le funzioni IDE appropriate. Se si installa di skewer-modequello che si avrà js2-modeper impostazione predefinita, poiché skewer-modedipende da esso.
  • Python: elpy , vedi le funzionalità IDE
  • Ruby: robe offre queste caratteristiche:
  • Vai alla definizione del metodo
  • Vai al super o ad un costruttore chiamato al punto
  • Passa a un modulo o a una classe (a condizione che abbia almeno un metodo definito)
  • Visualizza la documentazione del metodo
  • Visualizza le informazioni sul metodo chiamato al punto usando ElDoc
  • Completamento del metodo e del nome costante

Puoi anche usare ctagsper supportare molti linguaggi come shell script o Tcl ...


Qualche suggerimento suite per javascript?
user2522280

@BarryG C'è Tern e j2-modeho modificato nella mia risposta.
Tu Do

2
Vorrei sottolineare la nostra che anacondapotrebbe essere una soluzione più specifica per il salto di definizione in Python.
PythonNut,

@TuDo Hai messo l'elenco delle funzionalità di Robe in ESS.
Dmitry,

Per C ++, ci sono anche tag e ycmd . Uso ycmd, che funziona anche con Python, C #, Go e altre lingue. Uso dumb-jump e counsel-rg come fallback o per mostrare gli usi o le menzioni commentate / doc di un simbolo.
unhammer,

18

Ho riscontrato un problema simile con emacs, quindi ho fatto Dumb Jump . Ho provato molte delle soluzioni menzionate nella risposta accettata, ma ho sempre riscontrato uno o più dei seguenti problemi:

  • La soluzione ha funzionato solo per un singolo linguaggio di programmazione
  • La soluzione ha richiesto un file di indice (TAG) o un processo persistente

Volevo disperatamente una soluzione che "funzionasse" e non richiedesse personalizzazione o installazione. Cioè, volevo clonare un repository casuale su Github e navigarlo come un altro dei miei progetti.

In questo momento Dumb Jump ha il supporto di base per:

  • JavaScript
  • Emacs Lisp
  • Pitone
  • Partire
  • PHP
  • Rubino
  • Faust
  • R
  • Lua
  • Ruggine
  • ... e altro ancora

È disponibile tramite MELPA e problemi di GitHub e le PR sono più che benvenute.


4

La soluzione principale per questo in emacs sta usando i file TAGS, che sono creati da programmi come etags o gtags. Io stesso uso (e raccomando) tag esuberanti e etags-select.el per aiutarti a restringere le destinazioni quando il simbolo di ricerca si trova in più destinazioni. Le lingue supportate sono piuttosto numerose, vedere i manuali dei singoli strumenti. C'è anche il supporto per l'aggiunta della tua lingua, per cui puoi fornire un'espressione regolare che istruisce i tag su come isolare i tag che ti interessano.


1
Oh! Come potrei dimenticare i file di tag? ctags -e -R *dalla directory principale lo imposterà per te.
Sean Allred,

è una soluzione accettabile quando il tuo progetto ha molte dipendenze (come i più recenti progetti di sviluppo web javascript)?
Rudolf Olah,

Il numero di dipendenze non è esso stesso un impedimento. Puoi avere un unico file tag che aggrega molte librerie diverse; L'ho fatto per molti anni, l'invocazione del comando ctags lo fa banalmente. O quello che ora consiglio è di avere un file tag separato per dipendenza; emacs è abbastanza intelligente da caricare più file di tag. Per facilitare ciò, cerca etags-table.el, che aiuta a caricare gruppi di file di tag per progetto.
InHarmsWay
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.