2010-08-19 19 views
6

Sto lavorando su un grande progetto C++. Sto lavorando con emacs negli ultimi sei mesi. Ho provato a configurare CEDET in modo da essere in grado di navigare facilmente ma ho trovato alcuni problemi.Funzioni di navigazione del codice sorgente di Emacs

1.- A volte la semantica non trova alcuni simboli e talvolta non ... non so con certezza quali file sono indicizzati semanticamente. Ho cercato di utilizzare EDE (seguendo le istruzioni in questo articolo http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html), ma ho trovato alcuni problemi anche ...

  • Ho versione multipla (Stampa) dello stesso progetto, ognuno nel proprio cartella. Come posso dire a Emacs con quale progetto sto lavorando?
  • Come posso dire a Ede dove cercare i miei file di intestazione? Posso specificare solo una directory root e la semantica cercherà i file header in tutte le sottodirectory?

2.- Stavo lavorando con vim + cscope qualche tempo fa e ricordo che c'era un modo per tornare indietro nella pila di simboli (Ctrl-t). C'è qualcosa di simile in emacs?

P.D.> Alcuni dati per rendere la domanda più chiara.

Ho più versioni dello stesso progetto. Ognuno ha la propria directory radice. Ogni progetto ha più moduli ciascuno all'interno di una sottodirectory. Ci sono file di intestazioni in ciascun modulo.

/home/user/ 
      | 
      \Release-001 
      |   | 
      |   \makefile 
      |   \ Module-001 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-001 
      |   |   |   \header-001.h 
      |   |   |   \header-002.h 
      |   |   \subdir-002 
      |   |   |   \header-003.h 
      |   \ Module-002 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-003 
      |   |   |   \header-004.h 
      |   |   |   \header-005.h 
      |   |   \subdir-004 
      |   |   |   \header-006.h 
      | 
      \Release-002 
      |   | 
      |   \makefile 
      |   \ Module-001 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-001 
      |   |   |   \header-001.h 
      |   |   |   \header-002.h 
      |   |   \subdir-002 
      |   |   |   \header-003.h 
      |   \ Module-002 
      |   |   | 
      |   |   \makefile 
      |   |   \subdir-003 
      |   |   |   \header-004.h 
      |   |   |   \header-005.h 
      |   |   \subdir-004 
      |   |   |   \header-006.h 

Questa è la configurazione su EDE ho nel mio .emacs

;; Cedet load commands 
(add-to-list 'load-path "~/emacs-dir/cedet/cedet") 
(load-file "~/emacs-dir/cedet/cedet/common/cedet.el") 

;; EDE: activating mode. 
(global-ede-mode t) 

;; Projects definition 
(ede-cpp-root-project "Release-001" 
        :name "Release-001" 
        :file "~/Release-001/makefile" 
        :include-path '("/" 
            ) 
        :system-include-path '("~/exp/include") 
        :spp-table '(("SUSE9" . "") 
           ) 
) 
(ede-cpp-root-project "Release-002" 
        :name "Release-002" 
        :file "~/Release-002/makefile" 
        :include-path '("/" 
            ) 
        :system-include-path '("~/exp/include") 
        :spp-table '(("SUSE9" . "") 
           ) 
) 

Giusto per farvi sapere ... Sto lavorando con la versione console (-nw) di emacs.

+0

Quali problemi hai riscontrato con EDE? –

+0

Ho modificato la domanda per aggiungere alcune nuove informazioni. Grazie per l'interesse. – thamurath

risposta

2

La tua configurazione è fondamentalmente corretta, tranne per: include-path per i tuoi progetti.

Se un dato file sorgente dice:

#include "Module-001/subdir-002/header-003.h" 

allora è ok. Se l'inclusione dice:

#include "subdir-002/header-003.h" 

allora il vostro: include-percorso dovrebbe avere

:include-path '("/Module-001") 

in esso.

Per quanto riguarda le cose che fanno indice semantico, indicizzerà il file corrente e tutto ciò che include può trovare. Usa la modalità di decorazione semantica per vedere quali intestazioni EDE ha trovato per te per determinare se la tua configurazione è accurata.

Inoltre indicizzerà tutti i file nella stessa directory di quella che si sta modificando, ma solo in idle time, quindi se non si lascia inattivo Emacs, non sarà in grado di farlo.

È possibile velocizzare le operazioni di indicizzazione se si utilizza CScope come suggerisce Bozhidar. È quindi possibile abilitare il supporto CScope sia in EDE che nel database Semantic. L'inclusione del supporto CScope in Semantic DB è recente, tuttavia, quindi è necessaria la versione CVS di CEDET. Ciò assicurerebbe che l'intera faccenda fosse indicizzata.

Per spostarsi all'indietro, ricercare l'aiuto per la modalità semantic-mru-bookmark. Tiene traccia dei tuoi progressi attraverso i tuoi file su una base con nome che è abbastanza utile e funziona sempre.

+0

Grazie per la risposta. Il problema è che i file di intestazione sono sparsi su tutto il progetto. Ogni modulo ha sottocartelle e le intestazioni sono all'interno di queste sottocartelle, quindi specifica tutti i percorsi in cui le intestazioni sarebbero un inferno. - C'è un modo per dire a Semmantic di cercare le intestazioni in tutte le sottodirectory lungo un percorso root? - Leggendo la documentazione EDE ho scoperto che "Invece di specificare percorsi come elenchi, è anche possibile fornire una funzione, che eseguirà una ricerca per includere i file nel progetto." Sfortunatamente non lo so. Qualunque posto dove posso trovare un esempio? Grazie! – thamurath

+1

Lo scopo del percorso di inclusione è quello di rendere più veloce la ricerca del percorso focalizzandola verso il basso. Se non vi è alcun vantaggio, la soluzione migliore è utilizzare CScope. Una volta che CScope è abilitato come caratteristica di localizzazione EDE (vedi la variabile ede-locate-setup-options) allora è come avere tutto come un percorso di inclusione per tutti i file. Ci sono probabilmente alcuni avvertimenti, ma non ho provato questo trucco per saperlo con certezza. – Eric

0

Avevo utilizzato in passato il Emacs Code Browser quando lavoravo su progetti C++ e l'ho trovato molto soddisfacente - in aggiunta ai grandi file e alla navigazione nella struttura del codice si ottiene un'eccellente integrazione VCS (icone diverse in base allo stato corrente di un file in il progetto). In concomitanza con ECB ho usato cscope per Emacs, dal momento che hai citato per Vim, probabilmente vorrai usarlo anche in Emacs.

In alternativa, se si desidera una soluzione più semplice, è possibile dare un'occhiata a Emacs Nav. Supporta anche alcune cose fantasiose e non ha alcuna dipendenza da semantica e speedbar: dovrai solo usare etags/ctags per indicizzare il tuo progetto.

Problemi correlati