gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:14:40 25 4
gpt4 key购买 nike

假设我使用 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") ... )
编辑:这个例子感觉它可能会在我的本地文件系统中打开一些漏洞。是否可以在不造成严重安全问题的情况下完成?

最佳答案

设置的 Emacs 端可以启动一个 HTTP 服务器来限制发布哪些文件。看起来可以直接在 Emacs 中执行此操作(例如 https://gist.github.com/TeMPOraL/f6f5333ae93de4ce9b5bd82cdad87d32 )。
然后远程部分可以使用 drakma 获取流。或 dexador .
这不依赖于史莱姆/斯旺克。
或者,您可以拨打 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)

关于emacs - 使用 swank/slime 在远程 Lisp 中加载本地文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69397351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com