如何自动执行这些emacs ESS(ess-remote)命令?

时间:2012-11-22 18:18:41

标签: r emacs elisp ess

我正在使用本地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和我已经google了一下,我似乎无法拼凑如何实际定义一个函数来自动化它(例如,在.emacs.el中)。有没有人实现过这样的事情?

1 个答案:

答案 0 :(得分:5)

假设您只想在代码中调用shell。在Lisp中,所有内容都是括号括起来的前缀表示法。所以我们将它输入缓冲区(比如临时缓冲区):

(shell)

将指针移动到close-paren之后的行尾,然后键入<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代码运行`(自动连接)时,你应该得到给定的东西。我把它作为练习留给读者添加你的​​其他命令。

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

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

现在您可以根据需要调用它,它将打开*shell*缓冲区,放入文本,并告诉Emacs告诉shell运行该文本。