Node.js中的REPL驱动开发

nfs0ujit  于 2022-12-22  发布在  Node.js
关注(0)|答案(1)|浏览(112)

在像ClojureScheme这样的语言中,我真的很喜欢在REPL驱动模式下编写代码,当你在编辑器中编写一段代码(在我的例子中是Emacs),把它发送到你的REPL,玩它,然后回到编辑器,修复发现的问题,并再次把代码发送到REPL。
我试着对Node.js做同样的事情,如果我只使用ES5语法的话,效果还不错,但是如果我使用ES6的特性,比如constletclass,我预料到在重新计算我的声明时会出现错误:

> let foo = 1;
> let foo = 2;
TypeError: Identifier 'foo' has already been declared

有没有Node.js REPL参数,或者修补的REPLs,或者甚至是一些神奇的Emacs模式,可以在我重新计算代码时清除现有的声明?这样我就可以用这种方式编写Node.js代码,而不需要不断地思考我使用的语法和/或在每次重新计算时手动重新启动REPL

sulc1iza

sulc1iza1#

如果使用的是nodejs-repl,则可以计算(M-:)以下代码:

(with-current-buffer "*nodejs*" 
  (setq kill-buffer-query-functions (delq 'process-kill-buffer-query-function kill-buffer-query-functions))
  (kill-process nil comint-ptyp) 
  (kill-buffer-and-window) 
  (run-with-timer 0.01 nil (lambda () (nodejs-repl))
))

这不是一个最佳解决方案,但它的工作原理如下:

  • 它评估当前缓冲区中的emacs lisp代码
  • 它杀死询问你是否要杀死窗口的函数(在小缓冲区中确认)
  • 它会停止允许nodejs和emacs之间通信的进程,因此它会终止nodejs进程(comint-ptyp)
  • 它将重新运行nodejs-repl

如果你想用另一个REPL来运行它,只需将缓冲区名称和命令改为"re-run"。
希望能有所帮助,
最好的问候

编辑

这里有一个更合适的解决方案,将其添加到您的.emacsnodejs-repl.el

(defun nodejs-repl-restart ()
  "restart the nodejs REPL"
  (interactive)
  (defvar nodejs-repl-code
    (concat "process.stdout.columns = %d;" "require('repl').start('%s', null, null, true, false)"))
  (with-current-buffer "*nodejs*"
    (kill-process nil comint-ptyp)
    (run-with-timer 0.01 nil (lambda ()
                  (setq nodejs-repl-prompt-re (format nodejs-repl-prompt-re-format nodejs-repl-prompt nodejs-repl-prompt))
                  (with-current-buffer "*nodejs*"
                (apply 'make-comint nodejs-repl-process-name nodejs-repl-command nil `("-e" ,(format nodejs-repl-code (window-width) nodejs-repl-prompt)))
                (nodejs-repl-mode) (erase-buffer) )))))

它几乎做了同样的事情,但它没有杀死缓冲区,而是擦除它。

相关问题