在像Clojure
和Scheme
这样的语言中,我真的很喜欢在REPL驱动模式下编写代码,当你在编辑器中编写一段代码时(在我的情况下为Emacs
),将它发送到您的REPL,使用它然后返回编辑器,修复发现的问题并再次将代码发送到REPL。
我尝试对Node.js
做同样的事情,如果我仅限于使用ES5
语法,它会有用。但是,如果我使用ES6
,const
和let
等class
功能,我预计会在重新评估声明时遇到错误:
> let foo = 1;
> let foo = 2;
TypeError: Identifier 'foo' has already been declared
是否有任何Node.js REPL
参数,或者可能已修补REPLs
,甚至是一些神奇的Emacs
模式,当我重新评估我的代码时,它会清除现有的声明?这样我就可以用这种方式编写Node.js
代码而无需经常考虑我正在使用哪种语法和/或需要在每次重新评估时手动重启REPL
。
答案 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))
))
这不是最佳解决方案,但是它的工作原理如下:
nodejs-repl
如果您想使用其他REPL运行它,只需将缓冲区名称和命令更改为“重新运行”。
希望它有所帮助,
祝你好运
这是一个更合适的解决方案,将其添加到您的.emacs
或nodejs-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) )))))
它几乎一样,但它不会杀死缓冲区并将其删除。