Pergunta

Eu uso o cscope emacs extensão (e encontrá-lo muito útil). Infelizmente, é comportamento padrão de apenas pesquisando o diretório atual e abaixo é insuficiente para mim, então eu uso o cscope-set inicial, para o diretório de minha escolha. Infelizmente, este tornou-se insuficiente para mim também porque eu tenho vários projetos diferentes, cada um com seu próprio diretório "inicial".

Eu configurei as teclas de atalho para os três métodos cscope eu uso o mais no 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)

Eu imaginei que seria muito fácil para envolver de alguma forma as chamadas com uma função para executar cscope-set-initial-diretório em um determinado caminho (gerado por olhar para o que o tampão-file-name is). Mas eu tenho, que ainda não tiveram sucesso!

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

não funciona. Eu também tentei adicionar ganchos para os dois cscope-ganchos, mas nenhum deles parece nunca ter chamado durante meus padrões de uso normais. Eu nem me importo de executá-lo uma vez a cada vez que ligo buffers, mas eu não vi um gancho para que qualquer lugar ou:. /

alguém pode me ajudar? :)

Foi útil?

Solução

Disclaimer:. Cscope eu não tenha instalado, portanto, não pode testar esta

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

A idéia básica é que você quer para solicitar um diretório para iniciar a partir de: essa é a chamada para interativo. Em seguida, você define o diretório: a declaração let faz isso para você. Em seguida, você chamar a rotina original que você queria, e chamando-a com 'call-interactively você se solicitado.

Você iria envolver as outras duas rotinas da mesma forma.

Uma vez que está trabalhando para você, você pode obter mais extravagante personalizando prompt para uma área de raiz para ter sua própria variável história que é compartilhada entre as três rotinas.

Quanto à sua solução inicial, que era uma boa oportunidade. A maioria não percebe a necessidade de 'interactive para ativar a função em um comando. A razão o nome citado não funciona para você é que a citação simplesmente diz ao intérprete para tratar o símbolo como um símbolo e não a qualquer coisa com ele. Para chamar a rotina, você geralmente fazer:

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

Infelizmente, com uma chamada direta como a que logo acima, você tem que fornecer um argumento (a string para procurar). Assim, você pode adicionar algum código para o prompt para a cadeia, ou use o comando embutido no código para fazer a solicitação. Isso é o que o 'call-interactively é usado para, ele chama o comando e invoca sua forma 'interactive que faz a solicitação.

Além disso, é geralmente uma boa idéia para as teclas digitadas ligam a nomes de comandos, ao contrário de lambdas descalços, por duas razões: em primeiro lugar, se você sempre C-h k (M-x describe-key), você recebe um nome de comando significativa e, segundo, se / quando você modificar a função, você pode fazê-lo sem ter que mexer com a ligação também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top