Question

J'utilise l'extension cscope emacs (et la trouve plutôt utile). Malheureusement, son comportement par défaut consistant à ne rechercher que le répertoire actuel et les répertoires inférieurs est insuffisant, donc j'utilise le répertoire cscope-set-initial-directory dans le répertoire de mon choix. Malheureusement, cela m'est également devenu insuffisant car j'ai plusieurs projets différents, chacun avec leur propre "initial". répertoire.

J'ai configuré les touches de raccourci pour les trois méthodes cscope que 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)

J’ai pensé qu’il serait assez facile d’encapsuler ces appels avec une fonction permettant d’exécuter cscope-set-initial-directory sur un chemin donné (généré en examinant le nom du fichier tampon). Mais je n'ai pas encore réussi!

(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 points d'ancrage aux deux points d'ancrage cscope, mais aucun de ceux-ci ne semble avoir été appelé au cours de mes habitudes d'utilisation normales. Cela ne me dérangerait même pas de le lancer une fois à chaque fois que je changerais de tampon, mais je ne voyais pas non plus de crochet pour cela nulle part: /.

Quelqu'un peut-il aider? :)

Était-ce utile?

La solution

Clause de non-responsabilité: je n’ai pas installé cscope, je ne peux donc pas le tester.

(global-set-key (kbd "<f9>") 'my-cscope-find-this-text-string)
(defun my-cscope-find-this-text-string (dir)
  (interactive "DRoot area to start search:")
  (let ((default-directory dir))
    (call-interactively 'cscope-find-this-text-string)))

L'idée de base étant que vous souhaitez inviter 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 l'appelez avec 'appeler de manière interactive , vous y serez invité.

Vous souhaitez envelopper les deux autres routines de la même manière.

Une fois que cela fonctionne pour vous, vous pouvez devenir plus sophistiqué en personnalisant l'invite pour qu'une zone racine possède sa propre variable d'historique partagée entre les trois routines.

En ce qui concerne votre solution initiale, cela a été un bon essai. La plupart ne réalisent pas la nécessité 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:

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

Malheureusement, avec un appel direct comme celui ci-dessus, vous devez fournir un argument (la chaîne à rechercher). Vous pouvez donc soit ajouter du code pour demander la chaîne, soit utiliser le code intégré de la commande pour faire cette invite. C’est pourquoi l’appel interactif est utilisé; il appelle la commande et appelle son formulaire 'interactif qui effectue l’invite.

De même, c’est généralement une bonne idée de lier les séquences de touches au nom des commandes, par opposition à la lambda simple, pour deux raisons: premièrement, si vous faites jamais Ch k ( Mx clé ), vous obtenez un nom de commande significatif, et deuxièmement, si / lorsque vous modifiez la fonction, vous pouvez le faire sans avoir à muck avec la liaison.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top