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

4

假设我通过 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") ... )

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

2个回答

5

这个设置中,Emacs一侧可以启动一个HTTP服务器来限制发布哪些文件。看起来在Emacs里直接实现是可能的(例如:https://gist.github.com/TeMPOraL/f6f5333ae93de4ce9b5bd82cdad87d32)。

远程部分可以使用drakmadexador获取流。

这不依赖于Slime/swank。

另外,您可以调用eval-in-emacs来执行一个Emacs Lisp表达式,该表达式将返回包含文件内容的字符串。您可以编写一个自定义函数在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)

0

你尝试过直接编译缓冲区而不是加载文件吗?当然,这只有在缓冲区可以编译时才有用。

这个之前的答案似乎和你有关( 加载远程Lisp文件):

针对你的特殊情况,我建议你编译缓冲区(选择整个缓冲区 C-x h,然后 C-c C-c),而不是文件(C-c C-k)。

让人烦恼的是,这会改变缓冲区的点和标记。希望你不会一直编译整个缓冲区。


这是针对非Lisp数据文件的。没有代码,也没有s表达式。 - BnMcGn

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