【问题标题】:Emacs defadvice on python-mode functionEmacs 对 python-mode 函数的默认建议
【发布时间】:2009-09-13 04:52:45
【问题描述】:

在 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”;将变量设置为脚本缓冲区名称,然后弹出到缓冲区到该缓冲区以及类似的东西。没有成功!我想知道这个机制对某人来说是否显而易见......谢谢!

【问题讨论】:

    标签: python emacs elisp advising-functions defadvice


    【解决方案1】:

    在这种情况下,解决方案似乎是

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

    【讨论】:

      【解决方案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 缓冲区, 命令完成后它仍然会被隐藏。为了解决这个问题, 您可以添加另一条建议来调用 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 中使用 """triple quotes"""。我不 认为它们有效。

      【讨论】:

      • 谢谢!但也不起作用...... save-window-excursion 听起来像我想要的,但它似乎没有做任何事情,第二个翻转 Python 和脚本缓冲区的位置(尽管它确实将光标放在脚本缓冲区最初所在的窗口)。我最初尝试使用 pop-to-buffer 而不是 switch-to-buffer-other-window 进行类似的操作,它也将 Python 缓冲区放在脚本窗口中!
      • 如果您在 save-window-excursion 中运行命令,那么在它完成后,您的窗口配置应该与您之前运行该命令时相同。确保您没有启用任何其他干扰的旧建议。
      • 谢谢 - 是的,我的窗口配置没有改变,但光标最终在 Python 缓冲区中......我想我明白了这个概念,但我很困惑为什么这个或其他试验都不起作用...
      • From M-x describe-function save-window-excursion: "同时恢复所选窗口的选择。同时恢复当前缓冲区。"所以保存窗口游览应该是你想要的。我尝试了 (save-window-excursion (other-window 1)),它达到了我的预期,这让我回到了原来的位置。
      • 是的...在加载了新的 emacs 实例后,我已经尝试了您的所有建议,但它们似乎不起作用...我已经使用插入功能代替其他-窗口和我指定的文本出现在正确的(脚本)缓冲区中,但光标总是在 python 缓冲区中结束。我还尝试将 py-execute-region 包装在一个名为 my-py-execute-region(我绑定到 Cc|)的函数中,该函数使用 save-window-excursion、other-window 以及此处列出的所有其他替代方案,但仍然没有锁。感谢您对三重引号的提醒 - 但似乎没有任何效果!困惑...
      【解决方案3】:

      你所拥有的对我来说很好用。它应该自动激活,因此不需要单独激活。但是,您确实需要停用并重新激活建议才能使更改生效:

      1) 定义和激活建议

      2) 它不符合您的要求,因此请更改建议

      3) 停用它:(ad-deactivate 'py-execute-region)

      4) 重新激活它:(ad-activate 'py-execute-region)

      第 4 步应采用您在第 2 步中所做的更改。或者,您可以更改第 2 步中的代码,然后重新评估第 4 步中的代码(假设已设置激活标志)。

      【讨论】:

      • 谢谢!...但仍然不适合我。如果我用 (other-window 1) (插入 "x") 替换 defadvice 的正文,它会将 "x" 放在脚本缓冲区中,但光标仍在 Python 缓冲区中......非常混乱。
      • 是否有针对同一功能激活的其他建议?此时,我将启动一个普通的 emacs (emacs -q),加载 python 模式,定义并激活您的建议,看看它是否仍然无法工作。可能会发生一些奇怪的互动。
      【解决方案4】:

      我实际上并没有尝试过,但我确实为 find-file 做了类似的事情,并且在那里我需要在调用 other-window 之前调用 interactive。我实际上对 Emacs Lisp 并没有真正的了解,但这可能会奏效。

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

      【讨论】:

        猜你喜欢
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        相关资源
        最近更新 更多