Node.js中的REPL驱动开发

时间:2017-04-18 06:31:12

标签: javascript node.js emacs ecmascript-6 read-eval-print-loop

在像ClojureScheme这样的语言中,我真的很喜欢在REPL驱动模式下编写代码,当你在编辑器中编写一段代码时(在我的情况下为Emacs),将它发送到您的REPL,使用它然后返回编辑器,修复发现的问题并再次将代码发送到REPL。

我尝试对Node.js做同样的事情,如果我仅限于使用ES5语法,它会有用。但是,如果我使用ES6constletclass功能,我预计会在重新评估声明时遇到错误:

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

是否有任何Node.js REPL参数,或者可能已修补REPLs,甚至是一些神奇的Emacs模式,当我重新评估我的代码时,它会清除现有的声明?这样我就可以用这种方式编写Node.js代码而无需经常考虑我正在使用哪种语法和/或需要在每次重新评估时手动重启REPL

1 个答案:

答案 0 :(得分:1)

如果您使用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运行它,只需将缓冲区名称和命令更改为“重新运行”。

希望它有所帮助,

祝你好运


编辑

这是一个更合适的解决方案,将其添加到您的.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) ))))) 

它几乎一样,但它不会杀死缓冲区并将其删除。