如何禁用node.js REPL中的“特殊命令”?

3npbholx  于 2022-12-18  发布在  Node.js
关注(0)|答案(3)|浏览(232)

问题节点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_解决了这个问题)。

2admgd59

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”之后启动,因此您可以在这种意义上减少三次击键。

nbewdwxp

nbewdwxp2#

您可以简单地从示例中删除该命令:

const replServer = repl.start(/* ... */)
delete replServer.commands.load;

您甚至可以定义整个commands对象,请看参考实现:
https://github.com/nodejs/node/blob/main/lib/repl.js

ruarlubt

ruarlubt3#

这里有一些试探性的东西:使用node-copy-paste,我写了一个小模块,允许我paste()剪贴板的内容和eval s它后,固定行开始.
其格式为paste.js

var cp = require('copy-paste'); // npm install node-copy-paste

module.exports = function() {
  return eval(cp.paste().replace(/\n\s*\./g, "."));
};

然后在节点REPL中,paste = require('./paste'); paste()将使它运行。非常脆弱,但它可能经常解决问题,足以有价值。

相关问题