在python-mode函数上使用Emacs的defadvice

5 投票
4 回答
1730 浏览
提问于 2025-04-15 14:17

在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))

撰写回答