1

我的工作流程:

  • 破解 .R 或 test_*.R 文件
  • 保存缓冲区。
  • 使用 *R* 进程切换到窗口
  • 击中 Cp,RET。重新评估devtools::test()

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

4

3 回答 3

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)

那对你有用吗?

于 2015-08-27T20:08:41.440 回答
2

为了完整起见,在最新版本的 ESS 中有更简单的方法来执行此操作。

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

所以你可以通过(未经测试)实现这一点:

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

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

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

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

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

于 2020-07-06T14:44:57.840 回答
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)

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

ess 中很快就会有专门的devtools功能。关注这个问题

于 2015-08-28T11:14:47.460 回答