使用 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)。
远程部分然后可以使用 drakma
或 dexador
.
获取流
这个不依赖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)
假设我使用 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
, thenC-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)。
远程部分然后可以使用 drakma
或 dexador
.
这个不依赖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)