2009-09-03 5 views
0

J'ai besoin de CEDET pour eassist (eassist-list-methods est assez pratique). Dans eassist.el, il y a la ligneDans Emacs, comment puis-je charger un certain fichier quand (nécessite 'x) est appelé?

(require 'semantic) 

qui échoue si CEDET n'est pas chargé. La chose est que je n'ai pas besoin de CEDET tout le temps et il faut beaucoup de temps pour charger donc je veux différer le chargement jusqu'à ce que j'appelle eassist-list-methods.

Y at-il un moyen d'exécuter

(load "cedet") 

lorsque sémantique (ou quelque chose d'autre qui est fourni par CEDET) est requis?

Je suis à la recherche d'une solution simple qui ne change pas eassist.el.

Répondre

4

Genehack a probablement raison; Je suis trop littéral pour répondre à la question. La meilleure façon de gérer quelque chose comme ceci est de comprendre quelle (s) fonction (s) est (sont) requise (s) par un code externe, et d'ajouter autoload s pour eux.

Mais si autoload ne fonctionnera pas dans votre cas, la façon normale de faire quelque chose quand un fichier est chargé est de faire

(eval-after-load "semantic" '(load "cedet")) 

Mais je viens de remarquer que vous dites que semantic.el ne parvient pas à charger si CEDET n'a pas été chargé en premier. Comme implicite par le nom, eval-after-load exécute le code après le fichier spécifié est chargé.

Vous pouvez essayer de trouver un fichier différent pour déclencher le chargement, au lieu d'utiliser semantic.el. (Peut-être un autre fichier qui nécessite semantic.el.)

Si nécessaire, vous pouvez brancher en require:

(defadvice require (before CEDET-require activate) 
    (if (eq 'semantic (ad-get-arg 0)) 
     (load "cedet"))) 

Bien que (load "cedet") devrait probablement être (require 'cedet), ou vous aurez le vent rechargeant à chaque fois. (Je ne suis pas sûr si CEDET a un (provide 'cedet), donc je ne l'ai pas fait comme ça dans mon exemple.)

Notez que mettre des conseils sur require ne fera rien si la sémantique a déjà été chargée, donc vous pouvez besoin de vérifier d'abord (featurep 'semantic) et de charger cedet.el immédiatement si nécessaire.

+0

L'accrochage dans require fonctionne. J'ai dû supprimer l'apostrophe avant CEDET-require. Le problème est que même si eassist-list-methods se charge, il n'a rien à afficher. Je dois rétablir la mémoire tampon de sorte que toutes les opérations d'analyse syntaxique sémantique entrent en jeu. Cependant, ce n'était pas vraiment l'idée. Trop compliqué. Je suppose que je vais m'en tenir au chargement de CEDET quand je démarre Emacs. Cela n'arrive pas très souvent de toute façon. Eh bien, maintenant j'en sais plus sur defadvice;). – Eisen

1

En supposant que vous avez tous les trucs de CEDET dans votre load-path quelque chose comme:

(autoload 'eassist-list-methods "cedet" nil t) 

dans votre .emacs.d/init.el (ou tout autre fichier init) devrait faire l'affaire.

+0

Vous n'utilisez normalement pas l'extension ".el" avec 'autoload' ou' load', donc j'ai pris la liberté de l'enlever. – cjm

+0

Ah, oui, merci - copie-n-coller stupide du 'load cedet.el' dans la question ... 8 ^) – genehack

+0

Cela ne causerait pas de problèmes si 'eassist-list-methods' n'était pas défini dans cedet.el? – seth

0

je pourrais être vous malentendu, mais sinon la réponse est autoload: vous voulez charger eassist.el que lorsque vous invoquez l'une de ses commandes. Quand il charge, il va charger semantic ou CEDET ou ce dont il a besoin - ce n'est pas votre problème (il devrait être pris en charge par la conception de la bibliothèque eassist.el).

(autoload 'eassist-list-methods "eassist" nil t) 
Questions connexes