在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))))