【问题标题】:REPL Driven Development in Node.jsNode.js 中的 REPL 驱动开发
【发布时间】:2017-04-18 06:31:11
【问题描述】:

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

我尝试对Node.js 做同样的事情,如果我将自己限制为仅使用ES5 语法,它就会起作用。但是,如果我使用 constletclassES6 功能,我可能会在重新评估我的声明时遇到错误:

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

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

【问题讨论】:

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


    【解决方案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 代码
    • 它会终止询问您是否要终止窗口的功能(在 minibuffer 中确认)
    • 它会停止允许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) ))))) 
    

    它几乎做同样的事情,但它不会杀死缓冲区并删除它。

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2013-04-25
      • 1970-01-01
      相关资源
      最近更新 更多