2009-06-17 5 views
1

J'utilise l'extension cscope emacs (et je la trouve très utile). Malheureusement, le comportement par défaut de la recherche dans le répertoire courant et ci-dessous est insuffisant pour moi, donc j'utilise le répertoire cscope-set-initial dans le répertoire de mon choix. Malheureusement, cela est devenu insuffisant pour moi aussi parce que j'ai plusieurs projets différents avec chacun leur propre répertoire "initial".Habillage d'une fonction quotée dans emacs-lisp

J'ai mis en place des raccourcis clavier pour les trois méthodes Cscope j'utilise le plus dans emacs

(global-set-key [f9] 'cscope-find-this-text-string) 
(global-set-key [f8] 'cscope-find-global-definition) 
(global-set-key [f7] 'cscope-find-this-symbol) 

je me suis dit que ce serait assez facile à en quelque sorte envelopper ces appels avec une fonction à exécuter cscope-set-initial -directory sur un chemin donné (généré en regardant ce que le nom du fichier-tampon est). Mais j'ai encore échoué!

(global-set-key [f9] (lambda() (interactive) (cscope-set-initial-directory "blah") 'cscope-find-this-text-string)) 

ne fonctionne pas. J'ai également essayé d'ajouter des crochets aux deux crochets cscope, mais aucun de ceux-ci ne semble jamais être appelé pendant mes habitudes d'utilisation normales. Je ne serais même pas dérangé de l'exécuter une fois chaque fois que je passerais les tampons, mais je n'ai vu aucun crochet pour ça: /.

Quelqu'un peut-il aider? :)

Répondre

1

Clause de non-responsabilité: Je n'ai pas installé cscope, donc je ne peux pas le tester. L'idée de base étant que vous voulez demander un répertoire à partir de: c'est l'appel à interactif. Ensuite, vous définissez le répertoire: l'instruction let le fait pour vous. Ensuite, vous appelez la routine d'origine que vous vouliez, et en l'appelant avec 'call-interactively vous êtes invité.

Vous envelopperiez les deux autres routines de manière similaire. Une fois que cela fonctionne pour vous, vous pouvez obtenir colombophile en personnalisant l'invite pour une zone racine pour avoir sa propre variable d'historique qui est partagée entre les trois routines. En ce qui concerne votre solution initiale, c'était un bon essai. La plupart ne réalisent pas le besoin de 'interactive pour transformer la fonction en commande. La raison pour laquelle le nom cité ne fonctionne pas pour vous est que la citation indique simplement à l'interprète de traiter le symbole comme un symbole et de ne rien faire avec. Pour appeler la routine, vous feriez généralement faire:

(lambda() 
    (c-scope-find-this-text-string "some-string")) 

Malheureusement, avec un appel direct comme celui juste au-dessus, vous devez fournir un argument (la chaîne à rechercher). Ainsi, vous pouvez soit ajouter du code pour demander la chaîne, soit utiliser le code intégré de la commande pour faire l'invite. C'est ce que le 'call-interactively est utilisé pour, il appelle la commande et appelle son formulaire 'interactive qui fait l'invite.

En outre, il est généralement une bonne idée de lier les frappes aux noms de commandes, par opposition à nu lambdas, pour deux raisons: d'abord, si jamais vous C-h k (M-x describe-key), vous obtenez un nom de commande significative, et le second, Si/quand vous modifiez la fonction, vous pouvez le faire sans avoir à utiliser la liaison.

+0

Doux, votre conseil m'a totalement aidé. J'ai ajouté fini juste d'ajouter le (appel-interactivement 'bla) à ma tentative initiale et cela a fonctionné. Ce que je voulais vraiment faire était quelque chose de vraiment fantaisie comme avoir une fonction wrapper qui renvoyait une instruction lambda qui définissait le dir, puis appelait la fonction donnée.Mais je suppose que ce n'est pas possible à cause de la façon dont emacs-lisp effectue le scoping (l'argument donné au wrapper tombe hors de la portée dans l'instruction lambda renvoyée). Peut-être qu'il y a une façon différente de penser à ce problème dans emacs-lisp land? – jdizzle

+0

Je ne comprends pas très bien ce que vous décrivez, retourner une instruction lambda (fonction) semble inutile car il n'y a pas vraiment besoin de programmation d'ordre supérieur dans cette situation. –