2009-09-13 82 views
5

在python模式下,有一個名爲py-execute-region的函數,它將高亮顯示的代碼區域發送到Python緩衝區進行評估。評估之後,遊標位於Python緩衝區中,但我更希望它保留在腳本緩衝區中,以便繼續生成更多代碼。我寫了一個簡單的建議功能:Python模式函數Emacs defadvice

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

但是這並沒有做任何事情。我嘗試過其他變體,比如使用'around'而不是'after';設置一個變量到腳本緩衝區的名字,然後彈出緩衝到那個緩衝區和類似的東西。沒有成功!我不知道這個機制是否對某人顯而易見......謝謝!

回答

8

在這種情況下,解決方案似乎是

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

你在那裏有什麼工作適合我。它應該自動激活,所以單獨的激活應該是不必要的。但是,你需要去積極並重新激活建議更改生效:

1)定義和激活建議

2)你想要什麼它不會做,所以更改建議

3)停用它:(廣告停用 'PY-執行區域)

4)重新激活它:(廣告激活' PY-執行區域)

步驟4應該拿起的變化您在步驟2中完成。或者,您可以在步驟2中更改代碼,在步驟4中評估代碼(假設激活標誌已設置)。

+0

謝謝!...但仍然不適合我。如果我用(other-window 1)替換defadvice的主體(插入「x」),它將「x」放入腳本緩衝區,但遊標仍在Python緩衝區中......非常混亂。 – hatmatrix 2009-09-13 19:37:41

+0

是否有任何其他建議爲相同功能激活? 在這一點上,我將啓動一個普通的香草emacs(emacs -q),加載python模式,定義並激活您的建議,並查看它是否仍然無法工作。可能會出現一些奇怪的互動。 – 2009-09-13 21:28:48

2

使用around-advice將函數打包到 save-window-excursion,這將在命令完成後恢復之前的窗口 配置。

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

請記住,雖然,如果是尚未顯示Python的緩衝區, 仍然會在命令完成後隱藏。爲了彌補這方面, 你可以添加其他的忠告調用切換到緩衝區其它窗口在 結束:

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

此外,請務必不要在elisp的使用"""triple quotes"""。我不想 認爲他們的工作。

+0

謝謝!但是也不管用......save-window-excursion聽起來像我想要的,但它似乎沒有做任何事情,第二個翻轉了Python和腳本緩衝區的位置(儘管它確實將光標置於腳本緩衝區原來的窗口中)。我最初嘗試了類似於彈出緩衝區而不是切換到緩衝區其他窗口的類似方法,它也將Python緩衝區放在腳本窗口中! – hatmatrix 2009-09-13 21:23:55

+0

如果您在保存窗口偏移內運行命令,那麼在完成後,您的窗口配置應該與之前運行命令時相同。確保你沒有啓用任何其他舊的建議,以及干擾。 – 2009-09-13 22:09:09

+0

謝謝 - 是的,我的窗口配置保持不變,但遊標結束在Python緩衝區中...我想我明白了,但是爲什麼這個測試或其他測試都沒有工作,這讓我感到困惑... – hatmatrix 2009-09-14 05:56:22

1

我還沒有真正嘗試了這一點,但我做了查找文件類似的東西,並在那裏我需要調用其他之前調用互動-窗口。我其實並沒有Emacs Lisp的真正想法,但這可能會起作用。

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