使用 swank/slime 在远程 Lisp 中加载本地文件

Loading a local file in a remote Lisp with swank/slime

假设我使用 swank/slime 连接到远程 Lisp。我在本地计算机的磁盘上或也许在 ​​emacs 缓冲区中有一个数据文件。我想使用远程 Lisp 处理这个文件。

我显然可以退出 shell 并将文件 scp 到服务器,加载文件,处理它,关闭,删除文件,这样我就不会在服务器上造成混乱。

我也可以将文件粘贴到repl中:

> (defparameter *my-file* "[paste file here]")

但是如果文本中有引号或者文件是二进制的,这就很糟糕了。

两种选择都很麻烦。

有什么好的方法可以让本地 emacs 将文件隧道传输到远程 Lisp,以便远程 Lisp 可以将其作为流打开?

我想象的是这样的:

> (swank:with-open-client-file (s #p"/path/to/local/file") ... )

编辑:这个例子感觉它可能会在我的本地文件系统中打开一些漏洞。可以在不引起严重安全问题的情况下完成吗?

您是否尝试过直接编译缓冲区(而不是加载文件)?当然,这只有在缓冲区是可编译的情况下才有用。

之前的回答似乎相关(Load remote Lisp files):

For your particular case, I suggest you compile the buffer (select the whole buffer C-x h, then C-c C-c), not the file (C-c C-k).

The annoyance is that this changes the buffer's point and mark. Hopefully, you won't be compiling a whole buffer all the time.

设置的 Emacs 端可以启动一个 HTTP 服务器来限制发布哪些文件。看起来可以直接在 Emacs 中执行此操作(例如 https://gist.github.com/TeMPOraL/f6f5333ae93de4ce9b5bd82cdad87d32)。

远程部分然后可以使用 drakmadexador.

获取流

这个不依赖Slime/swank.

或者,您可以调用 eval-in-emacs 来执行一个 Emacs Lisp 表单,该表单将 return 一个包含文件内容的字符串。您可以在 Emacs 中编写自定义函数来授予或不授予对文件的访问权限。

例如一个不安全的版本如下:

(defun get-file (filename)
  (with-temp-buffer
    (insert-file-contents filename)
      (buffer-string))))

然后:

CL-USER> (swank:eval-in-emacs '(get-file "/etc/passwd"))
"......"

以上需要配置 Slime 才能启用 eval-in-emacs

一旦成功,您可以编写辅助函数:

(defun call-with-open-client-file (function file)
  (with-input-from-string (stream (swank:eval-in-emacs `(get-file ,file)))
    (funcall function stream)))

还有一个宏:

(defmacro with-open-client-file (var name &body body)
  `(call-with-open-client-file (lambda (,var) ,@body) ,name)