0

私はReadlineモジュールを使ってNodeJSで簡単なCLIアプリケーションを作っています。私はユーザーの入力をオートコンプリートしたいです。このため、私はモジュールのautocompletion functionを使用しています:NodeJS readlineでいくつかの単語が自動補完される

function completer(line) { 
    const completions = '.help .error .exit .quit .q'.split(' '); 
    const hits = completions.filter((c) => c.startsWith(line)); 
    // show all completions if none found 
    return [hits.length ? hits : completions, line]; 
} 

この機能により、私は1つのコマンドを完了することができるよ同じ行に複数のコマンドがない:

例えば:

(CLI App) > .e<tab> 
      .error .exit 

(CLI App) > .err<tab> 
(CLI App) > .error 

(CLI App) > .error .ex<tab> 
      .help .error .exit .quit .q 

は、私は、ユーザーが書いている現在のコマンドの唯一のオートコンプリート機能の提案を取得するためのcompleter関数を変更:

function completer(line) { 
    const completions = '.help .error .exit .quit .q'.split(' '); 
    const hits = completions.filter((c) => c.startsWith(line.split(' ').slice(-1))); 

    return [hits.length ? hits : completions, line]; 
} 

と私は正しいアドバイスを得ることなく、ユーザーの入力が変化しない:

(CLI App) > .e<tab> 
      .error .exit 

(CLI App) > .err<tab> 
(CLI App) > .error 

(CLI App) > .error .ex<tab> 
      .exit 
(CLI App) > .error .ex 

は、この問題を解決する方法はありますか?あなたが与えることができるすべての援助は非常に高く評価されるでしょう。

ありがとうございました。

+0

ヒットが1つしかない場合、 'line'の最後の部分をヒットに置き換えるのはどうですか?追加するのが難しいはずはありません。 –

+1

ありがとうございます@ChrisSatchell。私は 'line'の最後の部分を置き換えて動作させました! –

答えて

1

クリスのヒントを使用して解決策が見つかりました。lineの最後の部分をヒット(私が持っている場合のみ)に置き換えてください。

line(私が自動完成したい実際のコマンド)の最後の部分の長さを計算して、このコマンドの先頭にカーソルを移動します。それから、私はすべての行から現在のコマンドを差し引いて、ヒットします。最後に、カーソルを行末に設定します。

私はdocsの方法を運がなければ使用しようとしました。readline.cursorTo(stream, x, y)readline.moveCursor(stream, dx, dy)は私にとっては機能しません。

readline.clearLine(stream, dir)メソッドは、すべての行をクリアし、docに存在するにもかかわらず、「カーソルから右に」(必要な動作)を行いません。

function completer(line) { 
    const completions = '.help .error .exit .quit .q'.split(' '); 
    let cmds = line.split(' '); 
    const hits = completions.filter((c) => c.startsWith(cmds.slice(-1))); 

    if ((cmds.length > 1) && (hits.length === 1)) { 
     let lastCmd = cmds.slice(-1)[0]; 
     let pos = lastCmd.length; 
     rl.line = line.slice(0, -pos).concat(hits[0]); 
     rl.cursor = rl.line.length + 1; 
    } 

    return [hits.length ? hits.sort() : completions.sort(), line]; 
}