我该如何自动化这些emacs ESS (ess-remote)命令?

6
我正在使用本地的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中)。有人实施过类似的东西吗?
1个回答

5

假设你只想在代码中调用shell。 在Lisp中,所有东西都是前缀表示法,由括号包围。 所以我们将这个输入到一个缓冲区中(比如说,scratch缓冲区):

(shell)

将光标移动到括号后面的行末,键入<C-x C-e>以执行Lisp代码。您应该会看到调用了shell函数。
现在,让我们把它变成一个函数,这样我们就可以添加其他内容。创建函数的命令是defun,它需要函数名、参数列表(括在括号中),然后是函数体:
(defun automate-connection ()
  (shell))

将光标移动到代码末尾,按下<C-x C-e>,函数就会被定义。您可以通过执行以下操作从Lisp中调用它:

(automate-connection)

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

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

现在,当我们运行该命令时,会将“TERM=xterm”放入shell缓冲区。但实际上它并没有发送该命令。让我们尝试添加一个换行符。
(defun automate-connection ()
  (shell)
  (insert "TERM=xterm\n"))

这会换行,但并不实际运行命令。为什么呢?让我们看看回车键的作用。转到*shell*缓冲区,输入<C-h c>,然后按下回车键。(<C-h c>运行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 \n screen -rd") (comint-send-input) (ess-remote) )但是 (ess-remote) 看起来只有在我已经运行了一个 R-in-shell 进程时才能运行。我猜我需要在 (comint-send-input)(ess-remote) 之间做一些事情。 - Solomon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接