that other guy是正确的:rlwrap
会工作。不幸的是,它扔掉了 node
自己完成。如何避免这是一个FAQ,所以这里遵循一种方法来恢复完成:不是通过喂食TAB到包装的命令,然后 以某种方式解析结果混乱,但使用过滤器。
Filters是充当 rlwrap
插件的小脚本。可以重写用户输入,命令输出,提示,历史和完成单词列表。 他们可以写在perl
或python
并在管道中组合。
过滤器可以做一招:与用户的背后包装的命令交互(该cloak_and_dagger()
法)
因此,如果我们教node
,打印的prefix
完井我们可以使用 列表的新命令rlwrap_complete(prefix)
cloak_and_dagger("rlwrap_complete($prefix)")
以获取所有possibe完成,并将其用于rlwrap
自己的完成者。
这里是过滤器,perl
为node
写的,但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
doesn't use an init file like .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
...并享受与REPL搜索历史和 TAB完成!任何时候你按下TAB rlwrap
将有一个(不可见的)与node
聊天,拿出正确的完成。
其他rlwrap
好东西(彩色提示,vi
模式,附加过滤器)可以添加,如果你想要它们。
当然,任何REPL需要能够做一些元编程来访问自己的命名空间数据之前,我们可以使用相同的解决方案为node
您是否尝试过'rlwrap'?它可以让你在任何程序中使用readline输入 –
谢谢,它为我打开了一扇全新的大门。但不幸的是,即使我在'.inputrc'rlwrap'中设置了编辑模式vi'和'set keymap vi'并不尊重它,并且没有'vi-mode'。我尝试了socat,但它也有一些问题。 – Sassan
VI-模式'rlwrap NC本地主机8000'的作品,但它不'node','nesh'也不'bc'工作 – Sassan