2009-09-13 17 views
5

En el modo python, hay una función llamada py-execute-region que envía una región de código resaltada al búfer de Python para su evaluación. Después de la evaluación, el cursor está en el búfer de Python, pero preferiría que permanezca en el búfer del script para poder seguir produciendo más código. Escribí una función de asesoramiento simple:Defadvice de Emacs en la función de modo python

(defadvice py-execute-region             
    (after py-execute-region-other-window activate)       
    """ After execution, return cursor to script buffer """     
    (other-window 1)               
) 

Pero esto no sirve para nada. He intentado otras variantes como usar 'alrededor' en lugar de 'después'; estableciendo una variable para el nombre del buffer del script y luego pop-to-buffer para ese buffer y cosas así. ¡Sin éxito! Me pregunto si la mecánica de esto es obvia para alguien ... ¡Gracias!

Respuesta

8

En este caso, la solución parece ser

(custom-set-variables 
'(py-shell-switch-buffers-on-execute nil)) 
1

Lo que tienes allí funciona bien para mí. Y debería activarse automáticamente, por lo que una activación separada no debería ser necesaria. Sin embargo, sí es necesario para de-activa consejos y volver a activar para que los cambios tengan efecto:

1) definir y activar consejos

2) no hace lo que quiere, por lo que cambian el consejo

3) desactivarlo: (ad-dESACTIVACIÓN 'py-ejecutar-región)

4) reactivarlo: (ad-activate' py-ejecutar-región)

Paso 4 debe recoger los cambios lo hiciste en el paso 2. Alternativamente, puedes cambiar el código en el paso 2 y luego simplemente volver evalúe el código en el paso 4 (suponiendo que se establece el indicador de activación).

+0

¡Gracias! ... pero todavía no funciona para mí. Si reemplazo el cuerpo del defadvice con (other-window 1) (inserte "x"), pone "x" en el búfer del script pero el cursor aún está en el búfer de Python ... muy confuso. – hatmatrix

+0

¿Hay algún otro consejo activado para la misma función? En este punto, comenzaría con un simple emacs vainilla (emacs -q), cargaré el modo python, definiré y activaré su consejo, y veré si todavía no funciona. Puede haber alguna interacción extraña pasando. –

2

Utilice la información general para ajustar la función en una llamada al save-window-excursion, que restaurará la configuración de la ventana anterior después de que el comando finalice.

(defadvice py-execute-region 
    (around preserve-window-configuration activate) 
    "After execution, return cursor to script buffer" 
    (save-window-excursion ad-do-it)) 

tener en cuenta, sin embargo, que si el búfer Python no se muestra ya, seguirá siendo ocultos tras la orden se completa. Para remediar esto, puede añadir otra pieza de asesoramiento para llamar interruptor-to-buffer-other-window al final :

(defadvice py-execute-region 
    (after show-pybuf-other-window activate) 
    "After execution, show the python buffer in another window." 
    (switch-to-buffer-other-window "[PYTHON BUFFER NAME]")) 

Además, asegúrese de que no utiliza """triple quotes""" en elisp. Yo no creo que funcionan.

+0

¡Gracias! Pero tampoco funciona ...save-window-excursion suena como lo que quiero pero no parece hacer nada, y el segundo cambia la posición de los buffers de Python y script (aunque coloca el cursor en la ventana donde originalmente estaba el buffer de script). ¡Inicialmente había intentado algo similar con pop-to-buffer en lugar de switch-to-buffer-other-window y también colocaba el búfer de Python en la ventana del script! – hatmatrix

+0

Si ejecuta un comando dentro de save-window-excursion, luego de que termine, la configuración de su ventana debe ser idéntica a cuando ejecutó el comando antes. Asegúrate de no tener otros consejos antiguos habilitados que interfieran. –

+0

Gracias - sí, la configuración de mi ventana no ha cambiado pero el cursor termina en el búfer de Python ... Creo que entiendo el concepto pero me desconcierta por qué este o ninguno de los otros ensayos funcionan ... – hatmatrix

1

realidad no he intentado hacer esto, pero lo hice hacer algo similar para find-file, y de ahí que necesitaba para llamar interactiva antes de llamar a otra -ventana. De hecho, no tengo una idea real de Emacs Lisp, pero podría funcionar.

(defadvice py-execute-region             
    (after py-execute-region-other-window activate)       
    (interactive) 
    (other-window 1)               
)