2009-10-04 5 views
4

Comment puis-je créer Emacs pour compléter les mots figurant dans des fichiers d'inclusion C?Emacs comment compléter automatiquement les mots des fichiers include sur C?

#include <stdio.h> 
int main(){ 
print//<-- this is where I want it to complete printf 

Quelle est la manière la plus simple? (quelque chose de plus simple que Cedet)

+0

+1 Je suis intéressé de le savoir, aussi :) – warren

+0

en double de http://stackoverflow.com/questions/1285971/emacs-code-completion -pour-cc et http://stackoverflow.com/questions/671412/code-browsing-refactoring-auto-completion-in-emacs et je ne serais pas surpris s'il y en avait d'autres. Cela revient beaucoup. – dmckee

+0

Je pense que c'est assez spécifique pour en valoir la peine. – justinhj

Répondre

4

Commencez par générer des tags pour la source et incluez les fichiers que vous souhaitez compléter automatiquement. Voir mon blogpost pour des conseils sur using tags si vous n'avez pas utilisé de tables de tag avant.

Maintenant, si vous avez une table TAGS qui inclut le fichier stdio.h, vous pouvez compléter automatiquement 'printf' en utilisant la commande `complete-tag '.

complète-tag peut se lier ` » à une clé:

(global-set-key [f3] 'complete-tag) 
+0

Merci, j'ai aussi apprécié le blog :). –

0

Vous pouvez essayer M-/(dabbrev-expand). Cette commande tente de compléter l'identifiant qui précède immédiatement le point (c'est-à-dire où se trouve votre curseur) en utilisant le contenu du tampon courant, puis le contenu des autres tampons du même mode. Si la première offre n'est pas celle que vous voulez, continuez à taper M- /. Si vous avez l'habitude de garder une seule session emacs ouverte en permanence (ce qui, si vous ne l'avez pas, vous devriez vraiment l'acquérir), et que vous avez une poignée de fichiers du projet en cours, vous serez probablement capable de trouver l'extension que vous voulez pour un préfixe particulier. Donc, pour répondre à votre question originale, M-/vous trouverez l'achèvement printf que vous cherchez si (a) vous avez utilisé printf n'importe où ailleurs dans le tampon que vous éditez, ou (b) il apparaît dans tout autre fichier .c ou .h que vous avez ouvert dans emacs.

+0

@Dale: (a) vous avez utilisé printf ailleurs dans le tampon que vous modifiez, ou (b) il apparaît dans n'importe quel autre fichier .c ou .h que vous avez ouvert dans emacs.- OK, mais juste comme Liran, je voudrais qu'il entre dans les fichiers .h inclus. – Jay

+0

En ce qui concerne dabbrev-expand, la seule solution consiste à ouvrir le fichier d'inclusion, par exemple stdio.h, dans votre session emacs. Il semble que hippie-expand soit assez flexible si vous êtes prêt à écrire du code Lisp personnalisé pour charger automatiquement les fichiers include. Il y a aussi quelques idées intéressantes sur http://www.emacswiki.org/emacs/HippieExpand, en particulier la notion de complétion contre les tags. Si ceux-ci ne couvrent pas assez le problème, vous devez probablement regarder quelque chose comme CEDET. –

0

Vous pouvez également essayer hippie-expand, qui propose des options supplémentaires concernant l'emplacement des informations d'achèvement. Je lie M-/à hippie-expand, puis modifié l'ordre des éléments dans hippie-expand-try-functions-list comme suit:

(global-set-key (kbd "M-/") 'hippie-expand) 
(setq hippie-expand-try-functions-list '(try-expand-dabbrev try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-file-name-partially try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-complete-lisp-symbol-partially try-complete-lisp-symbol)) 

Cela fait hippie-expand agir comme le M- normal/au début, mais des pressions répétées vont produire des extensions plus possibles.

+0

J'ai essayé mais ça n'a pas marché. (Ouvert une session propre Emacs, évalué les lignes que vous avez suggéré ci-dessus, puis ouvert un nouveau fichier C et a fait exactement ce que Liran a dit.Il n'a pas trouvé ... – Jay

4

Contrairement-tag complète, dabbrev-expand, ou hippie-expand (qui ne dabbrev-expand comme des choses), la suite CEDET fait exactement ce que la question décrit. Lorsqu'on lui demande d'effectuer une complétion, il regarde et voit que vous avez inclus stdio.h, puis cherche des complétions possibles.

CEDET fait beaucoup d'autres choses liées à l'achèvement qui fournira des suggestions très ciblées et correctes, et pas seulement des suggestions vaguement similaires. Un effet secondaire est que CEDET prend plus d'effort pour mettre en place. Vous devez lui enseigner où vous incluez les fichiers, par exemple, et parfois comment gérer les macros, et à quoi ressemble le projet sur lequel vous travaillez.

Il y a plus de détails sur cette ici: link text