2017-04-19 8 views
1

内部的にgnu readlineを使用するノードのシェルはありますか?gnu readlineに基づくノードシェル

あなたが知っているように、ノードシェルは2通りの方法で吸います: これは履歴を検索しません。これは、https://github.com/danielgtaylor/nesh のようなものを使用することで解決できます。 gnuのreadline(psql、ipython、python、bashなど)を使用するシェルは、すぐに使える多くの機能を持ち、〜/ .inputrcで設定した設定を共有します。例えば、上記のすべてのシェルで良いvim-modeを持っているのは、gnuのreadlineを内部的に使っているからです。 gnuのreadlineを内部的に使っているjs用のシェルもあれば、それは他のシェルと調和しているでしょう。

+1

と同じソリューションを使用する前にデータとして独自の名前空間にアクセスするためのメタプログラミングのビットを行うことができる必要がありますか?どのプログラムでもreadlineを入力することができます –

+0

ありがとうございました。しかし残念ながら私の.inputrc 'rlwrap'に' edit-mode vi'と 'set keymap vi'を設定してもそれを尊重しないで' vi-mode'はありません。私はsocatを試しましたが、それにはいくつかの問題もあります。 – Sassan

+0

vi-modeは 'rlwrap nc localhost 8000'で動作しますが、' node'、 'nesh'、' bc'では動作しません。 – Sassan

答えて

5

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 .nodercnodeとして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

+1

詳細な答えをありがとう。私は 'fs 'の補完のために' -c'をrlwrapコマンドに追加するべきだと思います。 'も動作します。そうでない場合は、' fsの場合はprefixが空文字列になります。 ' – Sassan

+0

@Sassan:単語の区切り文字のリストからドット '.'を削除することは、' -c'aka '--complete-filenames'オプションの一番の効果です。一般的な方法は' --break- chars')しかし、あなたは正しいです:Javascriptの場合、 'fs.'のような接頭辞を完成させたいと思っています。あなたのコメントは、補完ハンドラが元の' @ completions'を '@ new_completions'に_add_する必要があることを知りました。ファイル名に "c"は完了しません。私はそれに応じて私の答えを編集しました。 –

+1

あなたの詳細な情報をありがとう、私は '-e '''を使用して、完了後に余分なスペースを避けることもできます。 – Sassan

1

rlwrapは、任意のプログラムにreadlineを使用させます。

プログラムが独自の行編集を使用していない(またはそうでないと確信できる)場合に最適です。特にnodeについては、使用することができます:

NODE_NO_READLINE=1 rlwrap node 
+0

'NODE_NO_READLINE = 1'ははるかに優れていました。私は 'rlwrap'が' -f'でオートコンプリートを受け入れることは知っていますが、基礎となるダイナミックreplのオートコンプリートを使うことはできますか?たとえば、 'fs.'と入力してtabを押すと、オートコンプリートノードが示唆するようになります。 – Sassan

+1

@Sassan:いいえ、悲しいです。 [タブの補完を無効にしてrlwrapを実行する方法はありますか?](http://stackoverflow.com/questions/9210931/is-there-a-way-of-running-rlwrap-with-tab-completion -disabled) –

+0

@HansLubはい、あなたの答えを読んでいます。ここでそれを述べてくれてありがとう。このコメントについて:http://stackoverflow.com/questions/9210931/is-there-a-way-of-running-rlwrap-with-tab-completion-disabled#comment11958744_9219349特定のコードを書くことが可能かどうか疑問に思っていました。特定のREPLを処理します。少なくとも普及しているREPLについては、ケースごとにタブ補完を扱うことについて話しています。問題は、ノードの周りのコミュニティがreadlineや標準的なものをまったく使用したくないということです。 – Sassan

関連する問題