在ESS进程中执行命令后刷新*R dired*缓冲区
我想建议在ESS进程中执行命令后刷新*R dired*缓冲区,r,emacs,hook,ess,comint-mode,R,Emacs,Hook,Ess,Comint Mode,我想建议send input交互函数调用我的函数,自动刷新*R dired*缓冲区。我试着用after和around作为类。例如: (defadvice inferior-ess-send-input (around ess-revert-rdired-after-send activate) ad-do-it (call-interactively 'ess-revert-rdired-buffer)) 我还尝试在之后使用,甚至更改了ESS的源代码来创建一个运行后钩子。他们都
send input
交互函数调用我的函数,自动刷新*R dired*
缓冲区。我试着用after
和around
作为类。例如:
(defadvice inferior-ess-send-input (around ess-revert-rdired-after-send activate)
ad-do-it
(call-interactively 'ess-revert-rdired-buffer))
我还尝试在之后使用,甚至更改了ESS的源代码来创建一个运行后钩子。他们都有同样的问题。我甚至定义了一个新函数,它一个接一个地调用
但我一直得到这样的信息:
ess错误:ess进程未就绪。请在重试之前完成您的命令
从ess命令提交
。出于某种原因,添加此建议会使sproccess
繁忙。有什么想法吗
附言
此处的功能是(正在进行的工作):
我发现等待0.05秒足以让流程做好准备。您解决了这个问题吗?我认为一般来说,这很难做到,因为R缓冲区通常无法向Emacs发送已完成的消息。我们可以尝试使用计时器每隔10秒左右刷新一次dired缓冲区,但在尝试更新之前,它会首先检查R进程是否繁忙。这对你有用吗?是的,我不能称我的解决方案为一般解决方案。例如,我没有对长脚本进行测试。但是0.5秒的等待时间对分配简单变量有效。结果证明,我的解决方案打破了多行函数定义。所以,有一个更好的方法来做这件事会很好,但我对基于计时器的方法持怀疑态度。是什么阻止Emacs像RStudio那样解决它?
(defun ess-revert-rdired-buffer ()
"If the buffer is live, update it. If it isn't start it."
(interactive)
(save-selected-window
(if (buffer-live-p (get-buffer "*R dired*"))
(save-excursion
(with-current-buffer "*R dired*"
(revert-buffer)))
(ess-rdired))))