emacs - 开发中如何在SLIME中快速重新加载和重启

标签 emacs lisp common-lisp slime sbcl

我开始使用 emacs 和 slime 来开发一些小服务。

我找到了一种在更改后重新加载代码的方法,但我希望它更方便、更快捷。

这就是我现在的做法:

  • 1) 启动 emacs,启动 slime,然后在 slime 中:

    2) (加载 "init.lisp") ;加载一些没有的初始化代码 改变

    3) (加载 "myseervice.lisp");这包含我的代码 致力于

    4)(我的服务:开始)

    5) 此时 seeervice 正在运行,我可以对其进行测试。然后我 更改 myseervice.lisp,修改它。将代码交换为 新版本我这样做:

    6)(我的服务:停止)

    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) (开发助手:开始)

    5) 此时 seeervice 正在运行,我可以对其进行测试。然后我 更改 myseervice.lisp,修改它。将代码交换为 我梦寐以求的新版本:

    6) (devhelper:reload)

但此时它卡住了。

而且我不坚持这个 devhelper 的想法,我只是想要一个更顺畅的开发周期。

真正的 lisper 会怎么做?我对这一切都很陌生,我来自传统的编程背景 ;) 使用 IDE 和导入。

最佳答案

历史

在 SLIME/Emacs 中重用以前的命令并不困难。

命令 M-pM-n 获取上一个或下一个输入。 M-rM-s 允许您在输入中搜索(使用正则表达式)。

从缓冲区执行

另一种方法是将命令写到一个 Lisp 文件中,在缓冲区中打开该文件,然后您可以从那里执行它们。

重新加载

你的重载想法没问题。您可以关闭服务,加载新代码并再次启动服务。你应该找出它卡住的原因。你应该调试它。您的手册和编码版本之间的区别之一是:停止、加载和启动之间的时间在编码版本中要短得多。你应该检查是否有问题。

更高级的代码组织

通常,当您有多个文件时,使用一个或多个系统 来组织代码是有意义的。如果您的代码在您使用文件编译器编译代码的文件中,这也很有意义。这样您就可以尽早收到警告和错误。在 Common Lisp 中,开发人员经常使用 ASDF 作为系统工具。许多实现还有自己的(或多或少的特性)。

系统工具为您提供了一些可以在系统上使用的命令:

  • 加载:如有必要(或强制)加载编译后的代码或源代码
  • 编译:必要时(或强制)编译代码
  • 编译和加载:必要时(或强制)编译和加载代码...

通常它会发出编译或加载代码所需的最少命令。但是您可以强制它重新加载或重新编译所有内容。

通常一个系统可以有子系统。例如,一个子系统可以是一个编译服务。如果更改代码,请保存它并编译并加载子系统。 ASDF(或类似工具)将编译更改的文件并加载它们。

更高级:为系统工具编写您自己的命令,然后停止正在运行的服务,编译/加载更改,然后启动服务

建议:

让您的版本继续运行,找出它挂起的原因。

关于emacs - 开发中如何在SLIME中快速重新加载和重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178152/

相关文章:

emacs - ctrl-x o 向后(与其他窗口相反)?

macros - 数学 : Unevaluated vs Defer vs Hold vs HoldForm vs HoldAllComplete vs etc etc

common-lisp - 在 common lisp 中访问向量

lisp - 在 Common Lisp 中通过对象引用传递

scheme - 让错误并为方案过程返回/打印 "string"

Common-Lisp:绑定(bind)形式参数,到底传递了什么?

Emacs Shift-Tab 左移 block

emacs - 在 emacs 中对齐或美化代码

regex - emacs org 模式,只搜索标题

macros - 旁边不需要空格的 Clojure 宏