如何在org-mode中逐行评估代码?

7
我希望能够在Org模式的代码块中逐行执行代码。我的目标是逐行执行代码而无需一次性运行整个代码块(C-c C-c),也无需切换到特殊缓冲区(C-c ')。我使用R语言,但这种方法也可以应用于其他语言。是否有一种方法可以实现这一点?
示例:仅执行以下代码块的第一行,使变量“a”在会话中得到值7。
#+BEGIN_SRC R :session
a <- 3 + 4 
a <- 5 + 6
#+END_SRC

你将使用什么标准来确定哪些行应该被执行? - Dominic Comtois
评估标准是光标下的行。我猜最终应该调用ess-eval-region-or-line-and-step函数,但不确定最佳方法是什么。也许在光标位于代码块内时切换到ess-mode? - Rodrigo
@Rodrigo 为澄清一下,您是否关心将输出放入 #+RESULTS: 中?否则,按您所说的,通过运行 M-x ess-eval-region-or-line-and-step 来完成这个任务是微不足道的。您可以为其绑定一个键,并即使在您的缓冲区不处于ess-mode模式时也可以使用它。 - Stefan Avey
我不关心 #+RESULTS:。我只想运行一些特定的代码行,而无需切换到特殊缓冲区。我尝试了 M-x ess-eval-region-or-line-and-step,但是会提示我选择方言,然后在选择 R 后 Emacs 就会卡住。我正在使用 Spacemacs,不确定这是否是原因。 - Rodrigo
我不熟悉spacemacs,但这可能是原因。当我处于org-mode时,使用Emacs 24.3.1、R版本3.1.2和org版本20130802运行您的示例,使用ess-eval-region-or-line-and-step对我有效。 - Stefan Avey
它在我这里也适用于一个新的缓冲区。之前的问题是我有一行以 # stuff 开头,不知何故光标停在那里了。谢谢! - Rodrigo
2个回答

5

虽然不是完整的答案,但我认为如果你想逐行运行代码,最好在实际的R会话中进行,直到你弄清楚你真正想要什么。

如果您实际上希望在多个阶段获得结果,则可以将代码拆分成多个块,并且它们将使用相同的R会话“session”。

#+BEGIN_SRC R :session                                                                                                                                                                                         
a <- 3 + 4                                                                                                                                                                                                     
#+END_SRC                                                                                                                                                                                                      

#+RESULTS:
: 7                                                                                                                                                                                                            

#+BEGIN_SRC R :session                                                                                                                                                                                         
a <- a + 6                                                                                                                                                                                                     
#+END_SRC                                                                                                                                                                                                      

#+RESULTS:
: 13                                                                                                                                                                                                           

可能看起来有些奇怪,但我的目标正是为了避免在缓冲区中有很多块,从而影响可读性。 我的目标是拥有大块代码,并能够逐行运行以进行测试。 - Rodrigo
在这种情况下,我们可能可以修改一些org-babel代码来运行一行而不是整个src块。我会调查一下。我认为我们可以通过修改像ob-R.el中的org-babel-R-evaluate-session函数来实现(请参见此处的代码http://orgmode.org/w/?p=org-mode.git;a=blob_plain;f=lisp/ob-R.el;hb=HEAD) - Stefan Avey

3
在代码块中,可以使用C-c C-v z切换到带有代码的会话。然后,您可以逐行评估,就像在.R文件中一样,并使用C-'返回到.org文件。
请查看文档或在.org文件中使用C-c C-h进行快速参考。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接