NodeJS readline自动填充多个单词

时间:2017-06-22 19:51:20

标签: node.js autocomplete console-application command-line-interface

我正在使用Readline模块使用NodeJS创建一个简单的CLI应用程序。我想自动完成用户的输入。为此,我使用了模块的autocompletion function

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];
}

使用此功能,我可以在同一行中完成一个命令但没有多个命令:

例如:

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

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

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

我修改了完成函数,只获得用户正在编写的当前命令的自动完成建议:

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

有什么方法可以解决这个问题吗?您可以给予任何帮助。非常感谢。

感谢。

1 个答案:

答案 0 :(得分:1)

使用Chris的提示我得到了一个解决方案:用命中替换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];
}