如何使用readline建议使用制表符完成的文件?

Lek*_*eyn 6 readline tab-completion node.js

在Bash shell中,我可以使用tab-completion来使用建议文件和目录名称.如何使用nodejs和readline实现这一目标?

例子:

  • /<Tab>应该建议/root/,/bin/等等.
  • /et<Tab>应该完成/etc/.
  • fo<Tab>应该完成foobar假设当前目录中存在这样的文件.

我在考虑使用globbing(模式search_term.replace(/[?*]/g, "\\$&") + "*"),但有可能是我忽略了一个库吗?

这是我目前使用glob的方法,它在使用时被破坏,//<Tab>因为它返回规范化的名称并且可能还有其他一些奇怪之处:

function command_completion(line) {
    var hits;
    // likely broken, one does not simply escape a glob char
    var pat = line.replace(/[?*]/g, "\\$&") + "*";
    // depends: glob >= 3.0
    var glob = require("glob").sync;
    hits = glob(pat, {
        silent: true,
        nobrace: true,
        noglobstar: true,
        noext: true,
        nocomment: true,
        nonegate: true
    });

    return [hits, line];
}

var readline = require("readline");
rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    completer: command_completion
});
rl.prompt();
Run Code Online (Sandbox Code Playgroud)

Jér*_*yet 0

也许你可以看看 readdir: https: //www.npmjs.com/package/readdir

只需读取用户正在创建选项卡的目录,然后将用户输入与目录中每个文件的开头进行比较,如果文件名匹配,则将其显示给用户。就像是:

var readDir = require('readdir');

function strncmp(str1, str2, lgth) {
  var s1 = (str1 + '')
    .substr(0, lgth);
  var s2 = (str2 + '')
    .substr(0, lgth);

  return ((s1 == s2) ? 0 : ((s1 > s2) ? 1 : -1));
}

var userInput = // get user input;
var path = // get the path;
readDir.read(path, [*], function(err, files) {
    for (var i = 0; i < files.length; i++)
        if (strncmp(files[i], userInput, userInput.length) == 0)
            console.log(files[i]);
});
Run Code Online (Sandbox Code Playgroud)