Pregunta

Uso la extensión cscope emacs (y la encuentro bastante útil). Desafortunadamente, el comportamiento predeterminado de solo buscar en el directorio actual y debajo no es suficiente para mí, por lo que utilizo el directorio cscope-set-initial-directory en el directorio de mi elección. Desafortunadamente, esto también se ha vuelto insuficiente para mí porque tengo varios proyectos diferentes, cada uno con su propio "inicial". directorio.

He configurado teclas de acceso rápido para los tres métodos cscope que más uso en 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)

Pensé que sería bastante fácil envolver esas llamadas de alguna manera con una función para ejecutar cscope-set-initial-directory en una ruta dada (generada al observar cuál es el nombre del archivo de búfer). ¡Pero todavía no he tenido éxito!

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

no funciona. También he intentado agregar ganchos a los dos ganchos cscope, pero ninguno de esos parece ser llamado durante mis patrones de uso normales. Ni siquiera me importaría ejecutarlo una vez cada vez que cambie buffers, pero tampoco vi un gancho para eso en ningún lado: /.

¿Puede alguien ayudarme? :)

¿Fue útil?

Solución

Descargo de responsabilidad: no he instalado cscope, así que no puedo probar esto.

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

La idea básica es que desea solicitar un directorio para comenzar: esa es la llamada a interactivo. Luego configura el directorio: la declaración let lo hace por usted. Luego llama a la rutina original que deseaba, y al llamarla con 'call-interactively se le solicita.

Ajustarías las otras dos rutinas de manera similar.

Una vez que eso funcione para usted, puede ser más elegante al personalizar la solicitud para que un área raíz tenga su propia variable de historial que se comparte entre las tres rutinas.

Con respecto a su solución inicial, fue un buen intento. La mayoría no se da cuenta de la necesidad de 'interactive para convertir la función en un comando. La razón por la cual el nombre citado no funciona para usted es que la cita simplemente le dice al intérprete que trate el símbolo como un símbolo y que no haga nada con él. Para llamar a la rutina, generalmente haría:

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

Desafortunadamente, con una llamada directa como la de arriba, debe proporcionar un argumento (la cadena a buscar). Por lo tanto, puede agregar algún código para solicitar la cadena o usar el código incorporado del comando para realizar la solicitud. Para eso se usa ' call-interactively , llama al comando e invoca su forma ' interactive que hace la solicitud.

Además, generalmente es una buena idea vincular las pulsaciones de teclas con los nombres de los comandos, a diferencia de las lambdas desnudas, por dos razones: primero, si alguna vez haces Ch k ( Mx describe- ), obtienes un nombre de comando significativo y, en segundo lugar, si modificas la función, puedes hacerlo sin tener que manipular el enlace también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top