2009-09-13 14 views
5

In python-mode, esiste una funzione chiamata py-execute-region che invia una regione evidenziata di codice al buffer Python per la valutazione. Dopo la valutazione, il cursore si trova nel buffer Python, ma preferirei che rimanga nel buffer degli script, così posso continuare a produrre più codice. Ho scritto una semplice funzione di consulenza:Defacvice di Emacs in modalità Python

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

Ma questo non fa nulla. Ho provato altre varianti come usare 'around' piuttosto che 'after'; impostando una variabile sul nome del buffer dello script e poi su pop-to-buffer su quel buffer e cose del genere. Nessun successo! Mi chiedo se la meccanica di questo è ovvio per qualcuno ... Grazie!

risposta

8

In questo caso la soluzione sembra essere

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

Quello che hai funziona bene per me. E dovrebbe attivarsi automaticamente, quindi un'attivazione separata non dovrebbe essere necessaria. Tuttavia, si ha bisogno di de-attiva consulenza e riattivare per le modifiche abbiano effetto:

1) definire e attivare consiglio

2) non fa ciò che vuoi, in modo da cambiare il consiglio

3) disattivarlo: (ad-disattivare 'py-execute-regione)

4) riattivarlo: (ad-Attiva' py-execute-regione)

Fase 4 dovrebbe rendere effettive le modifiche hai fatto nel passaggio 2. In alternativa, puoi cambiare il codice nel passaggio 2 e poi solo valutare il codice nel passaggio 4 (supponendo che sia impostato il flag di attivazione).

+0

Grazie! ... ma ancora non funziona per me. Se sostituisco il corpo di defadvice con (other-window 1) (inserisci "x"), inserisce "x" nel buffer di script ma il cursore è ancora nel buffer Python ... molto confuso. – hatmatrix

+0

C'è qualche altro consiglio attivato per la stessa funzione? A questo punto, vorrei avviare una semplice vanilla emacs (emacs -q), caricare la modalità python, definire e attivare il tuo consiglio e vedere se non funziona ancora. Potrebbe esserci qualche strana interazione in corso. –

2

Utilizzare il consiglio di chiusura per avvolgere la funzione in una chiamata a save-window-excursion, che ripristinerà la configurazione della finestra precedente dopo il completamento del comando.

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

tenere a mente, però, che se il buffer di Python non è stato già mostrato, sarà ancora nascosta dopo il completamento del comando. Per ovviare a questo, è possibile aggiungere un altro pezzo di consulenza per chiamare switch-to-buffer-altro-finestra in fondo :

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

Inoltre, assicurarsi di non utilizzare """triple quotes""" in elisp. Io non penso che funzionino.

+0

Grazie! Ma non funziona neanche ...save-window-excursion suona come quello che voglio ma non sembra fare nulla, e il secondo gira la posizione di Python e buffer di script (anche se mette il cursore nella finestra in cui il buffer di script era originariamente). Inizialmente avevo provato qualcosa di simile con pop-to-buffer invece di switch-to-buffer-other-window e ha messo anche il buffer Python nella finestra dello script! – hatmatrix

+0

Se si esegue un comando all'interno di save-window-excursion, dopo la sua conclusione, la configurazione della finestra deve essere identica a quando è stato eseguito il comando in precedenza. Assicurati di non avere nessun altro vecchio consiglio abilitato che interferisca. –

+0

Grazie - sì, la configurazione della mia finestra è rimasta invariata, ma il cursore finisce nel buffer Python ... Credo di aver capito il concetto ma è sconcertante sul perché questo o nessuno degli altri trial funzionino ... – hatmatrix

1

Non ho effettivamente provato questo fuori, ma ho fatto fare qualcosa di simile per trovare file, e lì ho bisogno di chiamare interattivo prima di chiamare altri -finestra. In realtà non ho idea di Emacs Lisp, ma potrebbe funzionare.

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