在python-mode函数上使用Emacs的defadvice
在python模式下,有一个叫做py-execute-region的功能,它可以把你选中的代码区域发送到Python的缓冲区去执行。执行完后,光标会停在Python的缓冲区,但我希望光标能留在脚本的缓冲区,这样我就可以继续写更多的代码。我写了一个简单的辅助函数:
(defadvice py-execute-region
(after py-execute-region-other-window activate)
""" After execution, return cursor to script buffer """
(other-window 1)
)
但是这个函数根本没有任何作用。我尝试了其他的变种,比如用'around'代替'after';设置一个变量来保存脚本缓冲区的名字,然后再切换到那个缓冲区,类似这样的操作。可是都没有成功!我在想,这个过程对某些人来说是不是很明显呢……谢谢!
4 个回答
1
你这里的做法对我来说没问题。而且它应该会自动激活,所以不需要单独去激活。不过,你确实需要先取消激活再重新激活,才能让更改生效:
1) 定义并激活建议
2) 如果它没有达到你想要的效果,就修改这个建议
3) 取消激活: (ad-deactivate 'py-execute-region)
4) 重新激活: (ad-activate 'py-execute-region)
第4步应该能应用你在第2步所做的更改。或者,你也可以在第2步修改代码,然后只需重新评估第4步的代码(前提是激活标志已经设置)。
2
使用环绕建议来把这个函数包裹在一个叫做 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的缓冲区之前没有显示出来,命令完成后它还是会保持隐藏。为了让它显示出来,你可以在最后加一段代码,调用 switch-to-buffer-other-window
。
(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中不要使用 """三重引号"""
,我觉得它们是没用的。
9
在这种情况下,解决方案似乎是
(custom-set-variables
'(py-shell-switch-buffers-on-execute nil))