2009-09-13 15 views
5

W trybie python istnieje funkcja o nazwie py-execute-region, która wysyła podświetlony region kodu do bufora Pythona w celu oceny. Po zakończeniu oceny kursor znajduje się w buforze Pythona, ale wolałbym, aby pozostał w buforze skryptu, aby móc kontynuować tworzenie kolejnych kodów. Napisałem prostą funkcję doradczą:Defadvice Emacsa w trybie python-mode

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

Ale to nic nie robi. Próbowałem innych wariantów, takich jak używanie "wokół", a nie "po"; ustawienie zmiennej na nazwę bufora skryptu, a następnie pop-to-buffer na ten bufor i podobne rzeczy. Bez powodzenia! Zastanawiam się, czy mechanika tego jest dla kogoś oczywista ... Dzięki!

Odpowiedz

8

W tym przypadku rozwiązaniem wydaje się być

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

To, co tam masz, działa dobrze dla mnie. Powinien automatycznie się aktywować, więc oddzielna aktywacja nie powinna być konieczna. Jednak trzeba zrobić, aby de-aktywną i ponownie aktywować porady dla zmiany odniosły skutek:

1) zdefiniować i aktywować i doradzanie

2) nie robi tego, co chcesz, aby zmienić informacje

3) dezaktywować (ad dezaktywacja 'PY-wykonania region)

4) reaktywować (ad aktywować' PY-wykonania-region)

Etap 4 powinien odebrać zmian zrobione w kroku 2. Alternatywnie, możesz zmienić kod w kroku 2, a następnie po prostu oceń kod w kroku 4 (zakładając, że ustawiona jest flaga aktywująca).

+0

Dzięki! ... ale nadal nie działa dla mnie. Jeśli zamieniam ciało defadrownika na (inne okno 1) (wstaw "x"), wstawi "x" w buforze skryptu, ale kursor nadal znajduje się w buforze Pythona ... bardzo mylące. – hatmatrix

+0

Czy są dostępne inne porady dotyczące tej samej funkcji? W tym momencie chciałbym uruchomić zwykły emacs waniliowy (emacs -q), załadować tryb python, zdefiniować i aktywować twoją radę i sprawdzić, czy nadal nie działa. Może zachodzić dziwna interakcja. –

2

Użyj około-porady, aby zawinąć funkcję w połączeniu z save-window-excursion, która przywróci poprzednie okno konfiguracji po zakończeniu wykonywania polecenia.

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

Pamiętaj jednak, że jeśli bufor Python nie zostało już pokazane, to nadal będzie ukryty po dopełnia dowodzenia. Aby zaradzić tym, można dodać kolejną radę zadzwonić switch-to-buffer-drugiej-okno na końcu :

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

Ponadto, upewnij się, że nie należy używać """triple quotes""" w Elisp. Nie sądzę, że działają.

+0

Dzięki! Ale też nie działa ...save-window-excursion brzmi jakbym chciał, ale nic nie robi, a drugi odwraca pozycję Pythona i buforów skryptów (chociaż umieszcza kursor w oknie, w którym pierwotnie znajdował się bufor skryptu). Pierwotnie próbowałem czegoś podobnego z pop-to-buffer zamiast z switch-to-buffer-other-window i umieszczam bufor Pythona również w oknie skryptu! – hatmatrix

+0

Po uruchomieniu polecenia wewnątrz okna składowania zapisu, po jego zakończeniu konfiguracja okna powinna być identyczna, jak przed uruchomieniem tego polecenia. Upewnij się, że nie włączasz żadnych innych starych porad, które się wtrącają. –

+0

Dzięki - tak, moja konfiguracja okna pozostała niezmieniona, ale kursor kończy się w buforze Pythona ... Myślę, że dostaję tę koncepcję, ale zastanawia mnie dlaczego ten lub żaden inny test nie działa ... – hatmatrix

1

nie zostały faktycznie próbował tego na zewnątrz, ale zrobiłem coś podobnego do Find-pliku i tam musiałem zadzwonić interaktywny przed wywołaniem innych -okno. Właściwie nie mam pojęcia o Emacsie Lispie, ale to może zadziałać.

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