如何使用 readline 建议带有制表符补全的文件?

2023-12-31

在 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(使用前将#替换为@)

如何使用 readline 建议带有制表符补全的文件? 的相关文章

  • jQuery.ajax 发送 OPTIONS 和 POST,如何使用 Express.js (Node.js) 处理

    每当我的应用程序向服务器发送 ajax 请求时 ajax url config api url 1 register type POST contentType application json data some JSON data he
  • 使用 --prof 选项创建多个日志文件而不是一个 v8.log 的节点

    我正在尝试使用 prof 选项来分析我的 Node 应用程序 但我发现不是一个单一的 v8 log 文件 而是使用诸如isolate 0x9582b40 v8 log isolate 0xa1cab78 v8 6049 等前缀创建的多个文件
  • Socket.IO - 开放连接是一个问题吗?

    我目前正在与DerbyJS http derbyjs com 因为它促进了干净 干燥的客户端 服务器代码 附带好处 大多数人使用该框架的主要原因 是它使用 Socket IO 来创建实时应用程序 在这种情况下 我不need实时 但这是一个很
  • 如何在 Electron 应用程序上获得圆角?

    我目前正在尝试在我正在制作的电子应用程序上获得圆角 我已经尝试了目前在线提供的几乎所有解决方案 但没有一个有任何区别 如何让 Electron 应用程序变得圆润 制作无框透明窗 const myWindow new BrowserWindo
  • 如何将 Angular Universal 应用程序部署到 Node.js 生产服务器?

    我有一个带有 Universal 的 Angular 8 应用程序 我想将其部署到共享 Web 主机生产服务器 我提前与网络主机核实过 他们告诉我可以在他们的共享网络托管上托管 Angular 通用网络应用程序 但是 无论我做什么 我都无法
  • 使用express.js动态加载路线

    我使用express js作为网络服务器 并且想要一种简单的方法来将所有 app get 和 app post 函数分开以分隔文件 例如 如果我想为登录页面指定 get 和 post 函数 我希望在动态加载的路由文件夹中有一个 login
  • axios onUploadProgress 和 onDownloadProgress 不适用于 CORS

    我有一个用 Node js 编写的服务器 以及一个在浏览器中运行的 Web 客户端 客户端应向服务器上传和下载一些文件 服务器并不是最初交付客户端的服务器 所以这里就出现了跨域的情况 服务器使用cors https www npmjs co
  • Mongoose 4.4.12 中 Schema 方法范围内的“this”为空 {}

    当在 Schema 方法内记录到控制台时 对象 this 为 这发生在一天前 我一直在阅读教程和其他堆栈溢出问题 但不幸的是我没有找到原因的解决方案 这是我的模型 var mongoose require mongoose var Sche
  • OSX 10.7.5 上的 node-gyp -- dyld:惰性符号绑定失败:找不到符号

    我搜索了很多 我发现与同一问题最接近的是这个 也没有答案 问题 未找到符号 libintl gettext https stackoverflow com questions 13759044 symbol not found libint
  • 如何修复 MongoClient is not a constructor 错误

    我刚刚学习 JavaScript 和 Nodejs 根据我在网上找到的一些代码 我编写了以下应用程序 当我尝试运行它时 我在第 9 行收到错误 其中显示 new MongoClient 错误提示 MongoClient 不是构造函数 您能解
  • 如何停止 PythonShell

    如何终止 停止 Node js 中 PythonShell 执行的 Python 脚本的执行 我在交互模式下运行 输出通过 socket io 发送到给定的房间 如果没有更多的客户端连接到这个房间 我想停止 python 脚本的执行 这是我
  • 使用mockery和sinon模拟类方法

    我正在学习使用带有 sinon 的节点模块模拟进行单元测试 仅使用模拟和普通类 我就可以成功注入模拟 不过 我想注入一个 sinon 存根而不是一个普通的类 但我在这方面遇到了很多麻烦 我试图嘲笑的班级 function LdapAuth
  • 如何获取从 Express (Node.js) 中的表单传递的数据

    我想获取使用表单从页面传递的数据 并在重定向的页面中使用该数据 我的客户端有这个表格
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 是否可以在 Promise.all 稍后向数组添加 Promise?

    我正在做一个项目 我问自己启动这个项目是否可行Promise all在 Javascript 中 他们确实向数组添加了更多 Promise 的任务 以及它们是否也在运行 const runAsyncFunctions async gt co
  • AWS Lambda 上的 NodeJS 集群

    是否可以在 lambda 函数中使用 cluster 模块 我试过这个 use strict var cluster require cluster var http require http var os require os var n
  • 如何只读取文件的第一行

    我已经用谷歌搜索了一段时间 但我找不到只读取文件第一行的函数 我需要读取文本文件的第一行并从中提取日期 Perl 新手 open my file lt filename txt my firstLine lt file gt close f
  • Excel Add In - console.log 在哪里输出它的消息 - NodeJS

    我正在尝试使用 JavaScript API 创建 Excel 插件 但我不明白 console log 在哪里输出它们的消息 所有 Microsoft 文档都包含 console log 示例 但没有解释 console log 输出消息
  • 有没有办法在 TypeScript 2+ 中全局添加类型定义?

    我有一堆简单的 ts files 不是项目 即独立的 ts 脚本 他们使用一些 Node js 功能 TypeScript 和节点类型定义通过安装 npm install g typescript npm install g types n
  • 如何在浏览器同步中配置端口

    我有一个gulp任务运行于browser sync 默认情况下它运行在node js服务器的端口3000上 我想将默认端口更改为任何其他端口 例如3010 var gulp require gulp connect require gulp

随机推荐

  • R包中的源文件

    我正在构建一个非常基本的 R 包供我自己使用 有些文件需要另一个文件中的函数 因此 R 文件尝试获取 R 文件 这在构建过程中失败 两者都不 source util R nor source util R 工作 R 找不到该文件 所有文件都
  • 无法在 Android Nougat 通知的小图标中使用黄色

    我在 Android 7 x 中将通知小图标设置为黄色时遇到问题 我在用着notification setColor Color YELLOW 在构建通知对象时 它显示橄榄色而不是黄色 也尝试过使用notification setColor
  • RxJava 的后备 Observable

    我正在寻找一种更好的方法来实现使用 RxJava 时针对空结果的简单 Observable 后备系统 这个想法是 如果对一组数据的本地查询导致零项 则应该进行回退查询 可能是网络调用或其他查询 目前 我的代码包含以下内容 Observabl
  • WCF XML 结构 - 如何删除包装器节点?

    我在使用 List 对象时遇到问题 DataContract public class Recipe DataMember Name Allergies public List
  • AttributeError:类型对象“MyUser”没有属性“USERNAME_FIELD”

    我正在 django 中构建一个自定义 User 类 用于创建注册应用程序 每次尝试 makemigrations 时 我都会收到上述错误 据我所知 我的代码是根据 django 文档here https docs djangoprojec
  • 对 socket.io 使用 http 和 https

    我正在努力使socket io两者都工作http and https连接 但根据我当前的配置 它似乎只能在其中之一上工作 使用以下配置选项 它可以通过以下方式访问我的应用程序https 但是当尝试通过访问它时http它无法连接并且我收到错误
  • 反转字符串中单词的顺序

    我正在准备初级工作面试 我试图反转字符串中单词的顺序 但我的输出是一堆毫无意义的垃圾 我认为问题可能是因为我在函数中使用 char 无论如何 这是我的代码 include
  • .NET 4.8 中的异步等待递归导致 StackoverflowException(.Net Core 3.1 中没有!)

    为什么下面的代码在 Net4 8中只有17深度递归会导致StackOverflowException 然而 这在 NetCore 3 1 中不会发生 我可以将计数设置为 10 000 它仍然有效 class Program static a
  • 为什么除了“goog.inherits()”之外还需要“goog.base(this)”?

    在这段涉及构造函数的 Google Closure javascript 代码片段中 为什么是goog base this 必要的 没有Foo已经从 Disposable 继承goog inherits foo goog Disposabl
  • 只读具有值的 Excel 单元格 python win32com

    我有一个如下所示的 Excel 文档 num value1 value2 1 A 100 2 B 3 c 300 我想迭代value2对于值超过 200 的值 如果发现值超过 200 则打印value1 我遇到的最大问题是告诉它在到达包含文
  • 如何通过 colab.research 上的 conda 构建库?

    所以我想用python occ图书馆 这个需要conda forge待建 我尝试将其安装在基本笔记本 https colab research google com notebooks welcome ipynb scrollTo qtrm
  • 添加文本到列表输出

    我需要对使用 Powershell 获取的文件列表进行格式化 添加文本 我可以简单地使用以下脚本来获取我的文件列表 Get ChildItem c path where Length eq 0 select name 这可以很好地返回文件名
  • 可以在 if 语句中使用 2 个或多个 OR 条件吗? [复制]

    这个问题在这里已经有答案了 在论坛上提问之前 我尝试自己测试一下 但我的简单代码来测试它似乎不起作用 include
  • perl 中不带参数的 split

    我是perl新手 我想知道这行代码是什么意思 q dummy d v split 我通过谷歌搜索 但我没有找到使用 split 不带参数的解释 这种用法与 while 块有关吗 完整的代码片段是 open T opt judgments d
  • 用于获取智能卡序列号的 APDU 命令

    如何使用 APDU 命令获取智能卡的序列号 我尝试使用 SCardGetAttrib 函数来查询它winscard dll不幸的是 我被告知使用 APDU 命令来执行此操作 因为没有标准方法来获取序列号 问题是我无法弄清楚我的智能卡是什么类
  • 从 Perl 或 Python 解析 Java 类

    我想要获取一个 java 文件 识别文件中的第一个类 并从该类中获取有关注释 方法和属性的信息 两种语言中是否有任何模块已经做到了这一点 我也可以构建一个简单的正则表达式来执行此操作 但我不知道如何在正则表达式中识别指示类 方法结束的大括号
  • 删除CSS @media打印规则而不修改CSS文件[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我将引导 CSS 文件添加到我的页面 我不想修改 CSS 文件 当我尝试打印页面时 引导程序修改介质以打印样式并删除所有颜色属性 如何
  • Windows 10 Home 上的 Docker Desktop 3.2.2 崩溃,并显示错误“连接期间出错:此错误可能表明 docker 守护进程未运行”

    我正在运行的 docker 容器似乎在我的 macbook 上运行良好 但是当在我的 Windows 10 家用电脑上运行时 Docker 引擎将会崩溃 当我尝试使用 Docker CLI 时 它将无法连接并声称 docker 未运行 即使
  • 带有继承的 JPA ManyToOne 映射

    我有几个具有共同属性的实体 因此提取了共同参数 如下面的代码片段 MappedSuperclass public class BaseCustomerDemographicDetails Id GeneratedValue strategy
  • 如何使用 readline 建议带有制表符补全的文件?

    在 Bash shell 中 我可以使用制表符补全来使用建议文件和目录名称 我怎样才能用nodejs实现这一点readline http nodejs org api readline html readline readline crea