【问题标题】:How can I automate these emacs ESS (ess-remote) commands?如何自动化这些 emacs ESS (ess-remote) 命令?
【发布时间】:2012-11-22 18:18:40
【问题描述】:

我正在使用本地 emacs 实例 (aquamacs) 在远程服务器上运行 R 进程,并且我想自动化连接到我的服务器的过程。流程如下:

[在 emacs 中]

M-x shell

[在结果控制台中]

TERM=xterm
ssh -Y -C <my remote server>
screen -rd [and/or] R

[在 emacs 中]

M-x ess-remote
r

我在这里发现了这种通用方法:http://blog.nguyenvq.com/2010/07/11/using-r-ess-remote-with-screen-in-emacs/。 -Y -C 选项允许您使用 xterm 查看绘图。我不知道 lisp,尽管我已经用谷歌搜索了一下,但我似乎无法拼凑出如何实际定义一个函数来自动执行此操作(例如,在 .emacs.el 中)。有没有人实施过这样的事情?

【问题讨论】:

    标签: r emacs elisp ess


    【解决方案1】:

    假设您只想在代码中调用shell。在 Lisp 中,一切都是用括号括起来的前缀表示法。所以我们将它输入到一个缓冲区(比如暂存缓冲区)中:

    (shell)
    

    将您的指针移到闭括号后的行尾,然后键入&lt;C-x C-e&gt; 以执行 Lisp 代码。你应该看到shell 函数被调用了。

    现在,让我们把它变成一个函数,这样我们就可以向它添加其他东西了。创建函数的命令是defun,它需要函数名、参数列表(括号内),然后是函数体:

    (defun automate-connection ()
      (shell))
    

    将光标移动到代码末尾,点击&lt;C-x C-e&gt;,函数将被定义。你可以通过执行从 Lisp 调用它

    (automate-connection)
    

    好的,现在我们只需要将一些文本放入 shell 缓冲区。

    (defun automate-connection ()
      (shell)
      (insert "TERM=xterm"))
    

    现在,当我们运行它时,我们会将“TERM=xterm”放入 shell 缓冲区。但它实际上并没有发送命令。让我们尝试换行。

    (defun automate-connection ()
      (shell)
      (insert "TERM=xterm\n"))
    

    这会换行,但实际上并没有使命令运行。为什么不?让我们看看回车键的作用。转到您的*shell* 缓冲区,输入&lt;C-h c&gt;,然后按回车键。 (&lt;C-h c&gt; 运行 describe-key-briefly,它打印通过按给定键调用的函数的名称)。也就是说,当你点击 RET 时,它不是换行,而是实际调用comint-send-input。所以让我们这样做:

    (defun automate-connection ()
      (shell)
      (insert "TERM=xterm")
      (comint-send-input))
    

    现在,当您从任何 Lisp 代码运行 `(automate-connection) 时,您应该会发送给定的内容。我把它作为练习留给读者添加你的​​其他命令。

    但是等等!我们还没有真正完成,不是吗?我假设您不想移动到 Lisp 暂存缓冲区,输入(automate-connection),然后评估该代码。您可能只想输入 ,然后收工。默认情况下,您不能使用我们刚刚创建的函数执行此操作。幸运的是,允许这样做很简单:只需在函数中添加对 (interactive) 的调用即可:

    (defun automate-connection ()
      (interactive)
      (shell)
      (insert "TERM=xterm")
      (comint-send-input))
    

    现在您可以随意调用它,它会打开*shell* 缓冲区,放入文本,然后告诉 Emacs 告诉 shell 运行该文本。

    【讨论】:

    • 这非常有帮助,谢谢。我现在有:(defun automate-connection () (interactive) (shell) (insert "TERM=xterm \n ssh -Y -C &lt;myserver&gt; \n screen -rd") (comint-send-input) (ess-remote) )(ess-remote) 似乎没有运行,除非我已经运行了 R-in-shell 进程。我猜我需要在(comint-send-input)(ess-remote) 之间做点什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2018-08-20
    • 2014-07-29
    • 2019-02-14
    • 1970-01-01
    • 2019-05-15
    • 2011-03-27
    相关资源
    最近更新 更多