Lo que me gustaría hacer es preestablecer inteligentemente un valor predeterminado de buffer local para el argumento de cadena a la función compile
.Emacs/Emacs Lisp: ¿puedo insertar consejos antes de un formulario interactivo? o cómo preestablecer inteligentemente el compile-command?
Ahora compile.el está predeterminado a usar "make" como el comando. Puedo establecer esto estableciendo compile-command
. Incluso puedo hacer esa variable buffer-local. Eso funciona si quiero el mismo valor estático, siempre.
Pero me gustaría seleccionar inteligentemente el compile-command
dependiendo del contenido del búfer, el nombre del búfer, el contenido del directorio contenedor del archivo (si lo hay) y la fase de la luna. Básicamente quiero control sobre el valor predeterminado y luego permitir que el usuario interactivo anule ese valor preestablecido.
Tenía la esperanza de hacer esto con consejos anteriores. Pero esto no está funcionando como esperaba.
Leer el archivo advice.el, veo
Supongamos que una forma especial de función/macro/subr/tiene N piezas de antes de consejo, M piezas de alrededor de asesoramiento y K piezas de después de consejo. Suponiendo que ninguno de los consejos está protegido, su definición aconsejado tendrá este aspecto (índices cuerpo de forma corresponden a la posición del respectivo consejo en esa clase de consejos):
([macro] lambda <arglist>
[ [<advised-docstring>] [(interactive ...)] ]
(let (ad-return-value)
{<before-0-body-form>}*
....
{<before-N-1-body-form>}*
{<around-0-body-form>}*
{<around-1-body-form>}*
....
{<around-M-1-body-form>}*
(setq ad-return-value
<apply original definition to <arglist>>)
{<other-around-M-1-body-form>}*
....
{<other-around-1-body-form>}*
{<other-around-0-body-form>}*
{<after-0-body-form>}*
....
{<after-K-1-body-form>}*
ad-return-value))
Lo que esto me dice es que cuando la función recomendada es interactiva, 'invocar interactivamente' invoca el formulario interactivo antes de invocar el consejo anterior o cualquier consejo.
Y, cuando agrego consejos a compile
, el comportamiento que observo confirma esto. El consejo se invoca después de se procesa el formulario interactivo. La forma interactiva sugiere la cadena que se utilizará para la compilación, antes de mi consejo tiene la oportunidad de adivinar lo que debería ser y preestablecerlo.
Entonces ...
- ¿Cómo puedo obtener mi código se ejecute antes de que el formulario interactivo? ¿Puede un consejo hacer esto? Si no es un consejo, ¿algo más? o
- ¿cómo puedo predefinir dinámicamente
compile-command
para cualquier memoria intermedia?
Ideas apreciadas.
El comportamiento tiene sentido si tenemos en cuenta que todos los consejos tiene acceso a los valores de los argumentos que la función se invoca con, y que con el fin de determinar esos valores en un contexto interactivo, la forma interactiva se debe evaluar de antemano. (Cualquier persona interesada debe consultar la respuesta de Trey, que demuestra cómo asesorar al formulario interactivo.) – phils