我正在使用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
有什么方法可以解决这个问题吗?您可以给予任何帮助。非常感谢。
感谢。
答案 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];
}