作者:lanshan1126141 | 来源:互联网 | 2023-02-06 10:53
节点的shell是否在内部使用gnu readline?
如您所知,节点shell有两种方式(其中包括):它没有搜索历史记录.这可以通过使用像https://github.com/danielgtaylor/nesh
这样的东西来解决它太糟糕了.使用gnu readline的shell(比如psql,ipython,python,bash等)有很多开箱即用的功能,并且共享你在〜/ .inputrc中设置的配置.例如,我在上面列出的所有shell中都有很好的vim-mode,因为它们都在内部使用gnu readline.如果有一个js的shell也在内部使用gnu readline,那么它将与我的其他shell一致.
1> Hans Lub..:
那个人是对的:rlwrap
会工作的.不幸的是,它抛弃了
node
自己的完成.如何避免这是一个 FAQ,所以这里遵循一种方法来恢复完成:不是通过提供一个TAB包装的命令,然后以某种方式解析产生的混乱,但使用过滤器.
过滤器是充当rlwrap
插件的小脚本
.可以重写用户输入,命令输出,提示,历史和完成单词列表.它们可以写入perl
或python
组合在一个管道中.
过滤器可以再做一个技巧:与用户背后的包装命令进行交互(cloak_and_dagger()
方法)
因此,如果我们教node
一个rlwrap_complete(prefix)
打印完成列表的新命令,prefix
我们可以使用它
cloak_and_dagger("rlwrap_complete($prefix)")
来获取所有可能的完成,并将它们用于rlwrap
自己的完成.
这是为node
in perl
,for编写的过滤器,但是python
不同命令的版本看起来非常相似:
#!/usr/bin/env perl
use lib ($ENV{RLWRAP_FILTERDIR} or ".");
use RlwrapFilter;
use strict;
my $filter = new RlwrapFilter;
$filter -> completion_handler( sub {
my($line, $prefix, @completions) = @_;
my $command = "rlwrap_complete('$prefix')";
my $completion_list = $filter -> cloak_and_dagger($command, "> ", 0.1); # read until we see a new prompt "> "
my @new_completiOns= grep /^$prefix/, split /\r\n/, $completion_list; # split on CRNL and weed out rubbish
return (@completions, @new_completions);
});
$filter -> run;
现在我们要教node
这个命令rlwrap_complete()
.因为node
不使用init文件,就像.noderc
我们必须创建一个REPL实例并扩展它:
#!/usr/bin/env node
// terminal:false disables readline (just like env NODE_NO_READLINE=1):
var myrepl = require("repl").start({terminal:false});
// add REPL command rlwrap_complete(prefix) that prints a simple list of completions of prefix
myrepl.context['rlwrap_complete'] = function(prefix) {
myrepl.complete(prefix, function(err,data) { for (x of data[0]) {console.log(x)}});
}
移动过滤器代码$RLWRAP_FILTERDIR/node_complete
,将上面的代码保存为myrepl.js
可执行文件.然后打电话:
$ rlwrap -z node_complete ./myrepl.js
...并享受可搜索历史和 TAB完成的REPL !任何时候你按下TAB rlwrap
将有一个(看不见的)聊天,node
以提出正确的完成.
如果需要,可以添加其他rlwrap
好东西(彩色提示,vi
模式,附加过滤器).
当然,在我们使用相同的解决方案之前,任何REPL都需要能够进行一些元编程来访问自己的命名空间作为数据. node