that other guyは右です:rlwrap
が動作します。残念ながら、それは node
自身の完了をスローします。これを回避する方法はFAQです。したがって、ここで完了を復元する方法は次のとおりです:TABをラップされたコマンドに入力してから、 何らかの形でフィルタを使用してフィルタを使用します。
Filtersは、 rlwrap
プラグインとして機能する小さなスクリプトです。ユーザー入力、コマンド出力、プロンプト、履歴、補完単語リストを書き換えることができます。 perl
またはpython
で記述し、パイプラインで組み合わせることができます。ユーザーの背中の後ろに包まれたコマンドとの対話(cloak_and_dagger()
法)だから、
我々はnode
我々は を使用することができますprefix
の補完のリストを印刷し、新しいコマンドrlwrap_complete(prefix)
教える場合:
フィルターは、1つのより多くのトリックを行うことができますcloak_and_dagger("rlwrap_complete($prefix)")
すべての可能な完了を得るために、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()
を教えるために持っています。我々は に持ってdoesn't use an init file like .noderc
node
として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を楽しむ:次に呼んで!いつでもを押すと、TABrlwrap
は、node
と(見えない)チャットを行い、適切な補完を思い付きます。
その他rlwrap
希望の場合は、(色付きのプロンプト、vi
モード、追加フィルタ)を追加できます。
もちろん
、任意のREPLは、我々はあなたが `rlwrap`を試してみましたnode
と同じソリューションを使用する前にデータとして独自の名前空間にアクセスするためのメタプログラミングのビットを行うことができる必要がありますか?どのプログラムでもreadlineを入力することができます –
ありがとうございました。しかし残念ながら私の.inputrc 'rlwrap'に' edit-mode vi'と 'set keymap vi'を設定してもそれを尊重しないで' vi-mode'はありません。私はsocatを試しましたが、それにはいくつかの問題もあります。 – Sassan
vi-modeは 'rlwrap nc localhost 8000'で動作しますが、' node'、 'nesh'、' bc'では動作しません。 – Sassan