不少 emacs 包都提供了 repl 的支持,像 sly、ghci、python 这种能把当前写的代码直接送到 repl 里运行,来直接做测试,查看结果。这很方便,可很多时候我需要 eval 的东西是有上下文依赖的。特别是在项目里,为了到达这一步,需要走很长的一串流程,手建这个环境会非常的麻烦。
有什么比较好的方法来让 repl 快速到我所需要的这个上下文环境里呢?
不少 emacs 包都提供了 repl 的支持,像 sly、ghci、python 这种能把当前写的代码直接送到 repl 里运行,来直接做测试,查看结果。这很方便,可很多时候我需要 eval 的东西是有上下文依赖的。特别是在项目里,为了到达这一步,需要走很长的一串流程,手建这个环境会非常的麻烦。
有什么比较好的方法来让 repl 快速到我所需要的这个上下文环境里呢?
我的想法是给某个改变当前 buffer 就触发的全局钩子添加一个函数,当buffer当前路径变化时,就根据路径输入repl 特定的工作路径变更命令且发送到解释器来执行
不过具体是哪些buffer需要触发这个事件得考虑一下,也许可以限制在某个项目内
一个想法可能是写一个载入脚本, 比如叫做 .load-dep.lisp
, 放在一个地方, 然后里面的内容是类似于载入其他的依赖文件, 每次写好一个模块之后就把这个模块文件添加到 .load-dep.lisp
里面.
类似的操作在 common lisp 里面大概就是往 xxx.asd
里面的 defsystem
的 :component
里面加新的写好的模块, 然后每次重新进入这个环境的时候就 (ql:quickload xxx)
. 至少目前我是这么干的.
或者可以稍微不那么安全一点, 用 File Variable 来实现, 比如说在 foo.lisp
里面:
;; -*- eval: (sly-load-file "./bar.lisp") -*-
(format t "foo")
然后在 bar.lisp
里面:
(format t "balabala")
大概可以这样 (?) 最近看到一些老代码是这么干的.
我只有 lisp 和 clojure 的经验,之前自己的实践也是跟 3 楼的做法基本一致,不过我是把一系列上下文写在页面最底部的注释里
lisp 里就是
#|
(progn
(func-a b c)
(func-e f g)
;; ...
)
|#
clojure 里就是
(comment
(do
(func-a b c)
(func-e f g)
;; ...
)
;; For test only.
)
打开文件后手动 C-x C-e 去 eval 一下,就能获得自己想要的上下文了