问题节点REPL有一些“特殊命令”,如.break
和.save
。我 * 从不 * 使用这些命令,但我 * 非常 * 频繁地尝试粘贴到格式如下的REPL代码中:
words.append('ul')
.classed('my-class', true)
.selectAll('li.new-class')
.data((tuple, tupleIdx) => obj[tupleIdx])
.enter()
.append('li')
.classed('new-class', true)
.text(d => '' + foo(d));
(This是d3.js代码,但使用Promises时会发生类似的情况,Promises是一个从每行开始的.then(...)
链。)
当然,当节点在自己的行上看到.classed
或.then
时,它会抱怨“无效的REPL关键字”,并继续打印几个屏幕长的错误消息序列。
脆弱的伪解决方案我在Vim中使用了一个regexp来解决这个问题,它将右括号和点之间的任何空格移到点后面(为了完整性,:%s/)\n\(\s*\)\./).\r\1/
),但这很乏味,而且我经常想从浏览器复制粘贴,而不是切换到Vim来重新格式化一些代码。
问题是否有办法禁用节点REPL的“特性”,这些特性虽然是出于好意,但与标准JavaScript实践相冲突,比如以点开头的行?
或者这对于终端应用程序来说太复杂了,如果是的话,有没有办法通过浏览器的JS控制台(而不是node-monkey,它只处理console.log
)与节点REPL通信?
**PS.**这个问题主要是关于以.
开头的行,但另一个这样的冲突是_
(谢天谢地,n_解决了这个问题)。
3条答案
按热度按时间2admgd591#
你可以选择make your own custom REPL,这个选项可以给予你最大限度地控制repl的行为。
由于这里的主要问题是将多行代码粘贴到默认repl中,因此作为一种解决方法,请尝试使用the
.editor
special command。进入编辑器模式(
Ctrl+D
完成,Ctrl+C
取消)。在this question about writing multiple lines in the node repl的答案中也提到了这一点
如果您还对保存击键感兴趣,那么在进入编辑器时,自动完成功能似乎会在键入.“ed”之后启动,因此您可以在这种意义上减少三次击键。
nbewdwxp2#
您可以简单地从示例中删除该命令:
您甚至可以定义整个
commands
对象,请看参考实现:https://github.com/nodejs/node/blob/main/lib/repl.js
ruarlubt3#
这里有一些试探性的东西:使用node-copy-paste,我写了一个小模块,允许我
paste()
剪贴板的内容和eval
s它后,固定行开始.
。其格式为
paste.js
:然后在节点REPL中,
paste = require('./paste'); paste()
将使它运行。非常脆弱,但它可能经常解决问题,足以有价值。