Frage

Ich verwende die cscope Emacs-Erweiterung (und finde es sehr nützlich). Leider ist es Standardverhalten nur das aktuelle Verzeichnis suchen und unten reicht nicht für mich, so dass ich das cscope-set-initial-Verzeichnis in das Verzeichnis meiner Wahl. Leider hat dies auch für mich nicht ausreichend, weil ich mehrere verschiedene Projekte mit jeweils eigenen „initial“ Verzeichnis haben.

Ich habe Hot-Keys für die drei cscope Methoden gründen ich die meisten in Emacs verwenden

(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)

Ich dachte, es wäre ziemlich einfach sein, irgendwie diese Anrufe mit einer Funktion wickeln cscope-set-initial-Verzeichnis auf einem bestimmten Pfad (erzeugt durch einen Blick auf, was die Puffer-Datei-Name ist) ausgeführt werden. Aber ich habe bis jetzt noch nicht erfolgreich gewesen!

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

funktioniert nicht. Ich habe auch versucht Haken an den beiden cscope Haken Zugabe, aber keiner von denen scheinen immer während meiner normalen Nutzungsmuster genannt werden. Ich würde sogar nichts dagegen, es einmal jedes Mal laufe ich Puffer wechseln, aber ich habe nicht einen Haken für die überall entweder sehen. /

Kann jemand helfen? :)

War es hilfreich?

Lösung

Disclaimer:. Ich cscope nicht installiert haben, so kann dies nicht testen

(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)))

Die Grundidee ist, Sie für ein Verzeichnis zu veran beginnen soll aus: dass der Anruf auf der interaktiven ist. Dann setzen Sie das Verzeichnis: die let-Anweisung tut das für Sie. Dann rufen Sie die Original-Routine, die Sie wollten, und indem sie sie mit 'call-interactively rufen Sie aufgefordert erhalten.

Sie würden die beiden anderen Routinen in ähnlicher Weise wickeln.

Wenn das für Sie arbeitet, können Sie schickere erhalten, indem Eingabeaufforderung für einen Wurzelbereich Anpassen der eigenen Geschichte Variable zu haben, die über die drei Routinen gemeinsam genutzt werden.

In Bezug auf Ihre erste Lösung, das war ein guter Versuch. Die meisten wissen nicht, die Notwendigkeit 'interactive die Funktion in einen Befehl zu aktivieren. Der Grund der angegebene Name nicht für Sie arbeitet, ist, dass das Zitat einfach den Interpreter sagt das Symbol als Symbol zu behandeln und nicht mit ihm nichts zu tun. Um die Routine aufrufen, würden Sie im Allgemeinen zu tun:

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

Leider mit einem direkten Aufruf, wie die gerade oben, haben Sie ein Argument liefern (die Zeichenfolge zu suchen). So können Sie entweder einen Code hinzufügen, für die Zeichenfolge zu veranlassen oder den integrierten Code-Befehl verwenden, um die Aufforderung zu tun. Das ist, was die ‚call-interactively für verwendet wird, den Befehl ruft und ruft seine 'interactive Form, die tut die Aufforderung.

Außerdem ist es im Allgemeinen eine gute Idee, Tastenanschläge an Namen von Befehlen zu binden, im Gegensatz lambda entblößen, aus zwei Gründen: Erstens, wenn Sie jemals C-h k (M-x describe-key) tun, Sie einen sinnvollen Befehl Namen bekommen, und zweitens, wenn / wenn Sie die Funktion ändern, können Sie dies tun, ohne mit der Bindung und Dreck mit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top