在 Bash shell 中,我可以使用制表符补全来使用建议文件和目录名称。我怎样才能用nodejs实现这一点readline http://nodejs.org/api/readline.html#readline_readline_createinterface_options?
例子:
-
/<Tab>
应该建议/root/
, /bin/
, etc.
-
/et<Tab>
应该完成到/etc/
.
-
fo<Tab>
应该完成到foobar
假设当前目录中存在这样的文件。
我正在考虑使用通配符(模式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();
这是一个有一些怪癖的可行解决方案:
- 不支持相对路径
- 当尝试通过按两次 Tab 键来显示建议时,它会在建议列表中显示完整路径。
- 它更喜欢“/”而不是“\”,但在 Windows 上容忍“\”分隔符
- 它仅支持目录和文件。 (无设备、管道、套接字、软链接)
Code:
const { promises: fsPromises } = require("fs");
const { parse, sep } = require("path");
function fileSystemCompleter(line, callback) {
let { dir, base } = parse(line);
fsPromises.readdir(dir, { withFileTypes: true })
.then((dirEntries) => {
// for an exact match that is a directory, read the contents of the directory
if (dirEntries.find((entry) => entry.name === base && entry.isDirectory())) {
dir = dir === "/" || dir === sep ? `${dir}${base}` : `${dir}/${base}`;
return fsPromises.readdir(dir, { withFileTypes: true })
}
return dirEntries.filter((entry) => entry.name.startsWith(base));
})
.then((matchingEntries) => {
if (dir === sep || dir === "/") {
dir = "";
}
const hits = matchingEntries
.filter((entry) => entry.isFile() || entry.isDirectory())
.map((entry) => `${dir}/${entry.name}${entry.isDirectory() && !entry.name.endsWith("/") ? "/" : ""}`);
callback(null, [hits, line]);
})
.catch(() => (callback(null, [[], line])));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)