如何将标签完成添加到Nodejs CLI应用程序

Jon*_*ono 20 javascript autocomplete command-line-interface node.js

我想将标签完成添加到Nodejs CLI应用程序(最好是动态生成标签完成).

我发现了几个npm模块但不确定如何真正实现它们:

https://github.com/hij1nx/complete

https://github.com/mklabs/node-tabtab

所以我正在寻找的是所以我可以有一个nodejs文件,如下所示:

my-cmd create arg1 arg2
Run Code Online (Sandbox Code Playgroud)

但是我可能想要自动完成,如:

my-cmd cr<tab> -> create
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 12

使用我建的煎蛋卷包.如果你有任何疑问,请联系我.


guy*_*abi 5

编辑 - 快速回答

我回答后,我继续阅读tabtab源代码,发现我也可以运行

 pkgname completion install 
Run Code Online (Sandbox Code Playgroud)

安装完成。因为我的环境已经很脏了,我不知道它是否真的做了什么,但在我看来它确实做了..

更长的答案

@CameronLittle 提供了很好的文档。

对于不耐烦的,你可以从跑步开始

sudo bash -c 'pkgname completion > /etc/bash_completion.d/pkgname'
source /etc/bash_completion.d/pkgname
Run Code Online (Sandbox Code Playgroud)

这将为您当前的 bash 会话添加完成。

据我所知,新会话将自动完成。

为了使用户的过程无缝,您可以使用package.json 中的installpostinstall钩子

https://docs.npmjs.com/misc/scripts

确保默认情况下不打印任何内容。意味着运行pkgname应该导致没有输出,否则它将无法工作。

重要的!仅从 master 安装 tabtab

似乎 tabtab 有一个烦人的错误,该错误已在 master 中解决,但从未发布过..

修复它的相关承诺是这样的:https : //github.com/mklabs/node-tabtab/commit/f8473555bf7278a300eae31cbe3377421e2eeb26

它处理以--.开头的字符串的完成。

从 2014 年 2 月开始的提交,但是(2015 年 1 月)的最新版本是 2014 年 1 月的 0.0.2 .. 我认为不会有更多版本。

所以如果你想得到这个修复,你应该(!),只从 master 安装 tabtab。

不要像我一样浪费 2 个小时弄清楚你做错了什么:)

我是如何得出这个答案的?TL; 博士

虽然@CameronLittle 的回答给出了幕后的解释,但我想解释一下我是如何得出答案的。

我尝试使用tabtab具有关于安装它的明确部分的包。见https://www.npmjs.com/package/tabtab#completion-install

然而,这似乎对我不起作用。

查看他们指示添加的代码,我看到以下process.argv.slice(2)[0] === 'completion'内容使我运行命令pkgname completion,该命令输出以开头的内容

###-begin-pkgname-completion-###
### credits to npm, this file is coming directly from isaacs/npm repo
#
# Just testing for now. (trying to learn this cool stuff)
#
# npm command completion script
#
# Installation: pkgname completion >> ~/.bashrc  (or ~/.zshrc)
#
Run Code Online (Sandbox Code Playgroud)

这些话this file is coming directly from isaacs/npm repo让我更加疑惑。按照此处的其他答案,我查看了 /etc/bash_completion.d/npm - 它显示了相同的确切内容......所以评论。

我决定跑

pkgname completion > /etc/bash_completion.d/pkgname
Run Code Online (Sandbox Code Playgroud)

但是,这需要 sudo 权限,因此变为

sudo bash -c "pkgname completion > /etc/bash_completion.d/pkgname
Run Code Online (Sandbox Code Playgroud)

然后,为了将其应用于当前的 bash 会话,我必须运行

 source /etc/bash_completion.d/pkgname
Run Code Online (Sandbox Code Playgroud)

瞧!有用!

当我尝试打开另一个终端时,它仍然有效,所以我认为它适用于所有用户。如果没有 - 你应该将它添加到 .bashrc 或其他东西中。


小智 5

我想补充一点,有一个 npm 包 yargs可以为命令和选项启用 bash 完成快捷方式。

它可以选择输出 .bashrc 完成脚本。然后通过获取生成的脚本来启用 Bash 补全。

目前,它是 npm 上一个积极维护的软件包,每月下载量超过 100 万次。