2009-09-13 5 views
5

Im Python-Modus gibt es eine Funktion namens py-execute-region, die eine markierte Code-Region an den Python-Puffer zur Auswertung sendet. Nach der Auswertung befindet sich der Cursor im Python-Puffer, aber ich würde es vorziehen, dass er im Skriptpuffer verbleibt, damit ich weiter Code erzeugen kann. Ich schrieb eine einfache beratende Funktion:Emacs Defadvice auf Python-Mode-Funktion

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

Aber das tut gar nichts. Ich habe andere Varianten ausprobiert, wie "herum" und nicht "nach"; Setzen Sie eine Variable auf den Namen des Skript-Puffers und dann auf diesen Puffer und so weiter. Kein Erfolg! Ich frage mich, ob die Mechanik für jemanden offensichtlich ist ... Danke!

Antwort

8

In diesem Fall wird die Lösung

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

Was Sie dort haben, funktioniert gut für mich. Und es sollte automatisch aktiviert werden, so dass eine separate Aktivierung nicht notwendig sein sollte. Allerdings müssen Sie de-aktiv und Wieder activate Beratung für die Änderungen wirksam werden:

1) definieren und aktivieren Beratung

2) es nicht tun, was Sie wollen, so die Meinung ändern

3) deaktivieren: (ad-deactivate 'py-Execute-Region)

4) reaktivieren: (ad-activate' py-Execute-Region)

Schritt 4 die Änderungen abholen sollte Sie können den Code in Schritt 2 ändern und dann einfach werten Sie den Code in Schritt 4 aus (vorausgesetzt, das Aktivierungs-Flag ist gesetzt).

+0

Dank! ... aber noch nicht für mich arbeiten. Wenn ich den Körper des defadvice mit (other-window 1) (Einfügen "x") ersetze, setzt es "x" in den Skript-Puffer, aber der Cursor ist immer noch im Python-Puffer ... sehr verwirrend. – hatmatrix

+0

Wurde für die gleiche Funktion noch ein anderer Hinweis aktiviert? An diesem Punkt würde ich eine einfache Emacs (emacs -q) starten, laden Python-Modus, definieren und aktivieren Sie Ihre Beratung, und sehen, ob es immer noch nicht funktioniert. Es kann einige seltsame Interaktion geben. –

2

Verwenden Sie around-advice, um die Funktion in einen Anruf mit save-window-excursion einzubinden, der die vorherige Konfiguration des Fensters nach Abschluss des Befehls wiederherstellt.

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

Denken Sie daran, dass, obwohl, wenn der Python-Puffer wurde nicht bereits gezeigt, es wird immer noch nach dem Befehl ausgeführt versteckt werden. Um dem abzuhelfen, dass Sie einen anderen Ratschlag hinzufügen können anrufen Switch-to-Buffer-other-Fenster am Ende:

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

Also, stellen Sie sicher, dass Sie nicht verwenden """triple quotes""" in elisp. Ich denke nicht denke, dass sie arbeiten.

+0

Danke! Aber funktioniert auch nicht ...Save-Window-Exkursion klingt wie das, was ich will, aber es scheint nichts zu tun, und das zweite flippt die Position von Python- und Script-Puffern (obwohl es den Cursor in das Fenster bringt, in dem der Skriptpuffer ursprünglich war). Ich hatte ursprünglich etwas Ähnliches mit pop-to-buffer anstelle von switch-to-buffer-other-window versucht und es hat den Python-Puffer auch in das Skriptfenster gebracht! – hatmatrix

+0

Wenn Sie einen Befehl innerhalb einer Save-Window-Exkursion ausführen, sollte Ihre Fensterkonfiguration nach Abschluss des Befehls identisch mit der vorherigen sein. Stellen Sie sicher, dass Sie auch keine anderen alten Ratschläge aktiviert haben, die stören. –

+0

Danke - ja, meine Fensterkonfiguration ist unverändert, aber der Cursor landet im Python-Puffer ... Ich denke, ich bekomme das Konzept, aber es verblüfft mich, warum dieser oder keiner der anderen Versuche funktioniert ... – hatmatrix

1

Ich habe zu sein scheint nicht wirklich die ausprobiert, aber ich habe etwas ähnliches für find-Datei tun, und dort musste ich vor dem Aufruf von anderen interaktiven anrufen -Fenster. Ich habe eigentlich keine Ahnung von Emacs Lisp, aber das könnte funktionieren.

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