Emacs 如何在开发中的SLIME中快速重新加载和重启
我开始使用emacs和slime来开发一些小服务 我已经找到了一种在更改后重新加载代码的方法,但我希望这更方便、更快 我现在就是这样做的:Emacs 如何在开发中的SLIME中快速重新加载和重启,emacs,lisp,common-lisp,slime,sbcl,Emacs,Lisp,Common Lisp,Slime,Sbcl,我开始使用emacs和slime来开发一些小服务 我已经找到了一种在更改后重新加载代码的方法,但我希望这更方便、更快 我现在就是这样做的: 1) 启动emacs,启动slime,然后在slime中: 2) (加载“init.lisp”);加载一些不正确的初始化代码 改变 3) (加载“myseervice.lisp”);这包含了我的代码 致力于 4) (myservice:start) 5) 此时Seeservice正在运行,我可以对其进行测试。然后我 对myseervice.lisp进行更改
- 1) 启动emacs,启动slime,然后在slime中: 2) (加载“init.lisp”);加载一些不正确的初始化代码 改变 3) (加载“myseervice.lisp”);这包含了我的代码 致力于 4) (myservice:start) 5) 此时Seeservice正在运行,我可以对其进行测试。然后我 对myseervice.lisp进行更改,以对其进行修改。将代码交换到 新版本我会这样做: 6) (myservice:stop) 7) (加载“myservice.lisp”) 8) 转到4)重新启动它
到目前为止,这是可行的。但手动停止、重新加载和启动并不有趣。调用之间的slime中有大量输出,因此重用以前键入的命令(4)-7)并不容易 为了获得解决方案,我启动了一个devhelper软件包,该软件包只需一个命令即可完成这项工作,但它不起作用:
(defpackage :devhelper
(:use :common-lisp :myservice)
(:export :start :reload))
(in-package :devhelper)
(defun start ()
(myservice:start))
(defun reload ()
(myservice:stop)
(load "myservice.lisp") ;I think it is not possible to load it here,
;because this module is using the file that it is just loading
;But it does not have to work this way,
;I just like any good solution
(myservice:start))
我想我现在可以这样做了:
- 1) 启动emacs,启动slime,然后在slime中: 2) (加载“init.lisp”);加载一些不正确的初始化代码 改变 3a)(加载“myseervice.lisp”);这包含了我的代码 致力于 3b)(加载“devhelper.lisp”) 4) (devhelper:启动) 5) 此时Seeservice正在运行,我可以对其进行测试。然后我 对myseervice.lisp进行更改,以对其进行修改。将代码交换到 我梦想的新版本可以: 6) (devhelper:重新加载)
一个真正的lisper会怎么做?我对这一切都很陌生,我来自传统编程背景;)使用IDE和导入。历史记录 在SLIME/Emacs中重用以前的命令并不困难 命令
M-p
和M-n
获取上一个或下一个输入M-r
和M-s
允许您在输入中搜索(使用正则表达式)
从缓冲区执行
另一种方法是将命令写入Lisp文件,在缓冲区中打开文件,然后从那里执行命令
重新加载
你的想法没问题。您可以关闭服务,加载新代码,然后再次启动服务。你应该找出它为什么会结冰。你应该调试一下。手册和编码版本之间的一个区别是:编码版本中的停止、加载和启动之间的时间要短得多。你应该检查一下是否有问题
更高级的代码组织
通常,当您有多个文件时,可以使用一个或多个系统来组织代码。如果您的代码位于使用文件编译器编译代码的文件中,这也很有意义。这样,您可以在早期获得警告和错误。通常,Lisp开发人员使用ASDF
作为系统工具。许多实现还具有自己的功能(或多或少)
系统工具为您提供了一些可以在系统上使用的命令:
- 加载:必要时加载编译的或源代码(或强制加载)
- 编译:必要时编译代码(或强制编译)
- 编译和加载:必要时(或强制)编译和加载代码