在ESS中的缓冲区保存上运行Rdevtool :: test_that

时间:2015-08-27 19:12:34

标签: r emacs devtools ess testthat

我的工作流程:

  • 攻击.R或测试_ *。R文件
  • 保存缓冲区。
  • 使用* R *进程切换到窗口
  • 点击C-p,RET。重新评估devtools::test()

对我来说,这似乎太过艰巨了。为什么我在保存缓冲区时无法自动运行devtools::test()?请帮助,我的手指几乎不能承受七次额外击键的压力!

3 个答案:

答案 0 :(得分:2)

这适用于类似的设置(切换到shell缓冲区):

(defun devtools-test ()
  (interactive)
  (when (string-match (rx-to-string `(: ".R" eos) t) (buffer-name))
    (switch-to-buffer "*R*")
    (end-of-buffer)
    (insert "devtools::test()")
    (comint-send-input)))

(add-hook 'after-save-hook 'devtools-test)

这对你有用吗?

答案 1 :(得分:1)

您可以使用ess-eval-linewise功能。

像这样(未经测试):

(defun devtools-test ()
  (interactive)
  (when (and (equal ess-dialect "R")
             (string-match "^test.*\\.[Rr]$" (buffer-name)))
    (ess-eval-linewise "devtools::test()")))

(add-hook 'after-save-hook 'devtools-test)

我不建议这样做,因为有些软件包测试需要很长时间才能运行。你不希望它们在每次保存时运行。

很快就会有专门的devtools功能。请遵循此issue

答案 2 :(得分:1)

为了完整起见,在最新版本的devtools中,有更简便的方法可以实现这一点。

功能/命令ess-r-devtools-test现在运行devtools::test

因此,您可以使用(未​​试用)实现此目标:

(add-hook 'ess-r-mode-hook 
          (lambda () 
             (add-hook 'after-save-hook 'devtools-test)))

此外,ess-r-devtools-*下还有许多其他有用的功能可用于构建,安装等。

值得注意的是,使用通用参数调用ess-r-devtools-test会按当前文件过滤测试。

因此,从文件C-u M-x ess-r-devtools调用my-file.R将运行devtools::test(filter="my-file")

在为测试文件选择名称或仅重新运行当前测试文件时,请记住这一点。