Domanda

Uso l'estensione cacope emacs (e la trovo abbastanza utile). Sfortunatamente, il comportamento predefinito è solo la ricerca della directory corrente e di seguito non è sufficiente per me, quindi uso la directory cscope-set-initial-directory nella directory di mia scelta. Purtroppo questo è diventato insufficiente anche per me perché ho diversi progetti diversi ciascuno con il proprio "iniziale" directory.

Ho impostato i tasti di scelta rapida per i tre metodi cscope che utilizzo di più in 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)

Ho pensato che sarebbe stato abbastanza semplice racimolare in qualche modo quelle chiamate con una funzione per eseguire cscope-set-initial-directory su un determinato percorso (generato osservando qual è il nome del file buffer). Ma non ho ancora avuto successo!

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

non funziona. Ho anche provato ad aggiungere hook ai due cscope-hook, ma nessuno di questi sembra essere mai stato chiamato durante i miei normali schemi di utilizzo. Non mi dispiacerebbe nemmeno eseguirlo una volta ogni volta che cambio i buffer, ma non ho visto nemmeno un gancio per quello da nessuna parte: /.

Qualcuno può aiutare? :)

È stato utile?

Soluzione

Dichiarazione di non responsabilità: non ho installato cscope, quindi non posso provarlo.

(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'idea di base è che vuoi richiedere una directory da cui partire: questa è la chiamata a interattivo. Quindi imposta la directory: l'istruzione let fa questo per te. Quindi chiami la routine originale che volevi e chiamandola con 'call-interattivamente ti viene richiesto.

Avresti avvolto le altre due routine in modo simile.

Una volta che funziona per te, puoi diventare più elaborato personalizzando la richiesta per un'area radice di avere una propria variabile di cronologia condivisa tra le tre routine.

Per quanto riguarda la tua soluzione iniziale, è stata una buona prova. La maggior parte non si rende conto della necessità di 'interattivo per trasformare la funzione in un comando. Il motivo per cui il nome tra virgolette non funziona per te è che la citazione dice semplicemente all'interprete di trattare il simbolo come un simbolo e di non fare nulla con esso. Per chiamare la routine, dovresti generalmente:

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

Sfortunatamente, con una chiamata diretta come quella sopra, devi fornire un argomento (la stringa da cercare). Pertanto, è possibile aggiungere del codice per richiedere la stringa o utilizzare il codice incorporato del comando per eseguire il prompt. Questo è il motivo per cui viene utilizzato il in modo interattivo call , chiama il comando e invoca il suo modulo 'interattivo che fa il prompt.

Inoltre, è generalmente una buona idea associare le sequenze di tasti ai nomi dei comandi, al contrario delle bare lambdas, per due motivi: primo, se mai si fa Ch k ( Mx descrivi- chiave ), ottieni un nome di comando significativo e, in secondo luogo, se / quando modifichi la funzione, puoi farlo senza dover confondere anche con l'associazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top