假设您只想调用shell
代码。在 Lisp 中,一切都是用括号括起来的前缀表示法。所以我们把它输入到一个缓冲区(比如暂存缓冲区):
(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 运行该文本。