# [Emacs] Completion (no troll vs vim ^^) (résolu)

## kwenspc

Donc ce topic s'adresse à tous ceux qui touchent à emacs ici. Je cherche pas à troller avec Vim (pour moi le "troll" n'en est pas un, vim/emacs c'est comme fraise/vanille: question de goût. Fin de la parenthèse), donc si certains ont envie de s'amuser avec ça je les renvois à "l'énaûrme" topic: [DOW] VI vs. EMACS. 

Merci de pas venir pourrir ce présent thread.

J'essaie d'avoir une complétion du même genre que sous des IDE comme netbeans ou autre, donc tout ceux qui me sortent Ctrl+/ qui pointe sur dabbrev non merci. Le problème c'est qu'après toutes les infos lues, tous les essais, toutes les configs dans mon .emacs... c'est pas ça.

Petite explication. Je suis tombé sur cedet, qui semble être la grosse référence pour faire d'emacs un IDE plus complet que ce qu'il est de base. Le lien de référence pour son outil de parsing/completion (et autre) Semantic: http://cedet.sourceforge.net/intellisense.shtml

La complétion via ctags étant loin d'être ce que je cherche.

LE truc qui m'intéresse ici c'est le menu contextuel ainsi que les propositions qu'on y retrouve dedans. J'ai bien le menu contextuel mais point de propositions "complètes". Ce que je veux dire par propositions complètes c'est:

1 - il cherche d'abord dans le fichier courant

2 - dans les headers inclus 

3 - et plus globalement dans les headers qu'on trouve dans /usr/include

J'arrive parfaitement à avoir le 1. Ça marche tout seul, bon ok. Le 3 via semanticdb-ebrowse, j'ai crée la base de ref pour /usr/include.

Mais il me faut le 2. J'ai beau essayer de créer la base ebrowse pour mon projet courant, que dalle, rien. Autre soucis, dans le point 3, si j'ajoute disons /usr/include/gnutls, la base de ce dernier va aussi inclure /usr/include... ce qui fait qu'on a des fichiers à rallonge, super lourds. Amha c'est un bug, des bases redondantes comme ça c'est pas normal je pense.

Autre chose, j'ai bien lu la doc Cedet ainsi que A Gentle introduction to Cedet, et comme elles sont hyper bien faites (ironie inside) elles passent complètement sur les vraies questions... Et d'ailleurs elles sont obsolètes. Elles parlent de fonctions qui n'existe plus, ou alors qui génère des erreurs. Bref ça schmoute.

Et vous comment vous faites? avec ou sans Cedet? autre chose? rien?  (oui je m'attend bizarrement à avoir peu de réponse...  :Neutral:  )Last edited by kwenspc on Fri Sep 04, 2009 11:59 am; edited 1 time in total

----------

## xaviermiller

Oh, ce sujet m'intéresse  :Cool: 

----------

## kwenspc

Y a ce package aussi: Predictive

[edit] Trop général lui par contre, moi je veux un truc dédié au code[/edit]

----------

## ppg

Um j'ai utilisé que Ctags et ctrl + /, alors je peux pas beaucoup m'avancer sur le sujet.

Et les modes majeurs, certains comme auctex proposent des raccourcis ahurissant pour aller plus vite.

En farfouillant un peu un truc qui pourrait te plaire :

AutoComplete

Code d'exemple pour pyhton ici.

Et après on se demande pourquoi on préfère emacs  :Smile: 

----------

## kwenspc

Connaissais pas AutoComplete, mais apparement il est très très basique. Il est incapable d'évaluer des fichiers sources pour y créer un namespace contextuel, selon le fichier source courant. Dommage. Mais sinon oui dans la finalité c'est ce qu'il me faut (un menu pop-up, avec les possibilités).

[edit] hop hop hop, je me suis avancé trop vite: il semble pouvoir utiliser semantic derrière! Mais du coup on retombe sur mon problème de créer les bases de namespaces avec semantic  :Sad:  [/edit]

----------

## kwenspc

Bon histoire de vous donner une idée d'où j'en suis, et pourquoi pas de voir si ce qui chez moi ne fonctionne pas fonctionne peut-être chez vous... 

J'ai ça qui fonctionne: (je n'ajoutes pas le (require 'site-gentoo) personnelement, avec ou sans c'est pareil...)

```

(load "/usr/share/emacs/site-lisp/cedet/common/cedet" nil t)

(semantic-load-enable-excessive-code-helpers)

(require 'semantic-ia)

;; ça ajoute un menu TAGS, qui comporte le namespace local

(defun local-semantic-tag-menu-hook ()

  (imenu-add-to-menubar "TAGS"))

(add-hook 'semantic-init-hooks 'local-semantic-tag-menu-hook)

;; Le hook me permettant d'avoir le pop-up (si il y a des propositions)

(defun local-cedet-hook ()

  (local-set-key [(control return)] 'semantic-ia-complete-symbol-menu))

(add-hook 'c-mode-common-hook 'local-cedet-hook)

```

Maintenant ce qui marche "à moitié"

```

(require 'semanticdb-ebrowse)

(semanticdb-create-ebrowse-database "/usr/include/")

```

Ça permet de créer la base de namespace lié à tous les headers d'/usr/include... sauf des sous répertoires. 

Je me suis dis 'qu'à cela ne tienne j'ajoute (semanticdb-create-ebrowse-database "/usr/include/netinet") pour l'avoir lui aussi' et bien je me retrouve avec une autre fichier bd ebrowse (dans ~/.semanticdb) qui non seulement comporte les namespaces d'/usr/include/netinet mais aussi ceux d'/usr/include alors qu'on a déjà un fichier ebrowse pour ce dernier... on se retrouve avec une bdd de namespaces redondants, c'est du n'importe quoi. 

Ce qui ne marche pas du tout maintenant.

Il existe aussi une commande qui permet pour la session courante d'ajouter un repertoires d'includes:

```

(semantic-add-system-include "~/mon_projet/include" 'c-mode)

```

Aucune réaction...

Il existe aussi un (require 'semantic-gcc) qui est censé tout faire tout seul justement pour les en-têtes... tu parles robert. Là encore: rien.

Je veux dire: avec ou sans je ne vois aucune différence d'avec ce que j'ai en haut.

Il existe aussi ceci:

```

(require 'semanticdb-global)

(semanticdb-enable-gnu-global-databases 'c-mode)

(semanticdb-enable-gnu-global-databases 'c++-mode)

```

Les deux dernières lignes me donnent des erreurs... 

Voilà... Si chez vous ça marche tant mieux, mais moi je bloque  :Sad: 

[edit] même AutoComplete ne fait strictement rien. Je commence à plus rien piger là, ça parait "si simple" en démo, mais en vrai... Et pourtant cette fois j'utilise une initialisation de ce mode passé par un des dev.[edit]

[edit2]Mouarf ok AutoComplete à peine lancé, dès le premier caractère tapé il passe en mode off... joli bug. ok bug trouvé dans l'extension yasnippet, à pas utiliser donc. Là ça marche à peu près[/edit2]

[edit3] Bon au final je suis pas beaucoup plus avancé avec AutoComplete: ce dernier ne fournit que les nampespaces du fichier courant plus les quelques dico standard. gtags a l'air de rien donner, et semantic... bah on revient à mon problème de départ c-a-d que j'arrive pas le configurer comme il faut[edit3]

----------

## kwenspc

Je suis partis sur AutoComplete, l'intérêt et qu'il utilise l'overlay et peut alors aussi fonctionner en pop-up contextuel en console.

Maintenant... avoir une base de nom derrière c'est une autre paire de manche. 

Il y a une extension semantic:

```

(require 'auto-complete)

(require 'semantic-ia)

(defun ac-semantic-candidate (prefix)

  (if (memq major-mode

            '(c-mode c++-mode jde-mode java-mode))

      (mapcar 'semantic-tag-name

              (ignore-errors

                (or (semantic-ia-get-completions

                     (semantic-analyze-current-context) (point))

                    (senator-find-tag-for-completion (regexp-quote prefix)))))))

(defvar ac-source-semantic

  '((candidates . (lambda () (all-completions ac-prefix (ac-semantic-candidate ac-prefix)))))

  "Source for semantic.")

(provide 'auto-complete-semantic)

```

On peut alors ajouter la source ac-source-semantic au hook qui gère la completion C, ce que j'ai fait. Mais rien de se passe. En fait c'est comme si cette même source ne renvoyait rien. Pourtant: un semantic-ia-complete-symbol fonctionne (cette fonction appelle elle aussi semantic-ia-get-completions et semantic-analyze-current-context, et prise indépendamment ces deux dernières fonctions retournent bien un résultat) et AutoComplete aussi (j'ai insérer une source qui contient les mots clés du C et ça fonctionne). 

La moutarde commence à me monter au nez, quelque soit le problème: il trouve sa source dans semantic et l'outil qui souhaite l'utiliser  :Confused: 

----------

## kwenspc

Yech cha marche.  :Laughing: 

C'est pas encore totalement complet mais cette fois semantic interagit bien avec autocomplete, Et même si la gestions des namespaces venant de headers externe est pas au top, ça me suffit déjà. Apparemment, si on passe par EDE pour créer son projet, semantic arrive bien à gérer les headers du projet. à voir...

[edit] Si vous êtes intéressés je peux vous balancer une archive de mon .emacs par mail c'est plein de fichiers, --> MP[/edit]

----------

## xaviermiller

Merci pour l'info.

Oui, ton .emacs m'intéresse, ça fait longtemps que je suis intéressé par un autocomplete dans emacs sans avoir pris le temps de m'y pencher.

Ta solution tourne-t'elle aussi sur d'autres systèmes que Linux ?

----------

## ppg

Ah ouais ça pourrait être bien, au moins les fichiers qui concernent le autocomplete.

----------

## tmasscool

Je suis intéressé aussi par le .emacs, car ça fait également quelques jours que j'essaie d'avoir cedet qui fonctionne, sans succès...

----------

## kwenspc

 *XavierMiller wrote:*   

> 
> 
> Ta solution tourne-t'elle aussi sur d'autres systèmes que Linux ?

 

En principe oui je n'ai rien de spécifique nux. Mis à part peut-être CEDET (c'est le paque tqui contient ECB, EDE et Semantic) qui semple-t-il est un poil instable sous win, le reste devrait tourner sans problème.

Sinon j'ai pour le moment, pas d'emplacement web où vous mettre ça. Passez moi vos emails par MP que je vous l'envoie.

----------

## xaviermiller

"Vous avez ... 1 ... nouveau message"  :Wink: 

----------

## kwenspc

Envoyé! Ne reste plus que toi ppg  :Wink: 

[edit] J'ai oublié de préciser un truc: si vous codez en C vous aller avoir mon mode à moi (des tabs de 4, pas d'espaces à la place des tabs, quelques trucs comme ça). Si ça ne vous conviens pas (ce qui serait normal, c'est vraiment une question de goût) commentez la ligne qui charge c.el dans le .emacs[/edit]

----------

## kwenspc

Je pense avoir fixé 2 bugs, l'un dans auto-complete-yasnippet et l'autre dans auto-complete-etags (mais je suis pas totalement sûr, mon lisp est loin, en tout cas ça fonctionne cette mieux)

dans auto-complete-yasnippet: 

```

;; fonction ac-yasnippet-candidate, l'original cherche à recreer la table selon le major mode, 

;; apparemment cette fonction est dépréciée et il y en a une toute faite qui fournie la table 

;; correspondante au mode courant

(defun ac-yasnippet-candidate ()

  (let ((table (yas/current-snippet-table)))

      (if table

          (ac-yasnippet-candidate-1 table))))

```

dans auto-complete-etags:

```

changez: 

(eval-when-compile

  (require 'cl))

en

(require 'cl)

```

J'ai remarqué que sinon si vous tappiez sur ESC alors que le menu de completion est affiché, après cela auto-complete déconne.

----------

## ppg

 *kwenspc wrote:*   

> Envoyé! Ne reste plus que toi ppg 
> 
> [edit] J'ai oublié de préciser un truc: si vous codez en C vous aller avoir mon mode à moi (des tabs de 4, pas d'espaces à la place des tabs, quelques trucs comme ça). Si ça ne vous conviens pas (ce qui serait normal, c'est vraiment une question de goût) commentez la ligne qui charge c.el dans le .emacs[/edit]

 

Pas grave j'aime bien aussi les 4 espaces sans tab  :Wink: 

Au pire un petit coup de M-x customize et c'est réglé.

PS : je t'ai envoyé mon email un MP.

----------

## xaviermiller

 *kwenspc wrote:*   

> Envoyé! Ne reste plus que toi ppg 
> 
> [edit] J'ai oublié de préciser un truc: si vous codez en C vous aller avoir mon mode à moi (des tabs de 4, pas d'espaces à la place des tabs, quelques trucs comme ça). Si ça ne vous conviens pas (ce qui serait normal, c'est vraiment une question de goût) commentez la ligne qui charge c.el dans le .emacs[/edit]

 

Merci merci merci  :Smile: 

----------

