如何为Nodejs CLI应用程序添加选项卡自动完成功能

29

我希望为一个Node.js命令行应用程序添加选项卡完成功能(最好动态生成选项卡完成)。

我找到了一些npm模块,但不确定如何真正实现它们:

https://github.com/hij1nx/complete

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

所以我想要的是能够有一个类似于这样的nodejs文件:

my-cmd create arg1 arg2

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

my-cmd cr<tab> -> create

谢谢!


这不是你的应用程序中实现的内容,而是用户使用的 shell 中实现的。请参阅 http://askubuntu.com/questions/95211/how-do-i-set-up-bash-completion-for-command-arguments 了解 bash 如何实现此功能。 - Joe
1
我也处于同样的情况。已经找到了几个处理自动完成的 npm 模块,但我无法弄清楚如何运行示例。 - Diosney
@diosney。所以我已经开始着手处理一个包含它的项目。https://github.com/Jonovono/um。我也会提交更详细的答案,说明我是如何实现这一点的。 - Jonovono
3个回答

20

使用我开发的omelette包。如有疑问,请联系我。


6

编辑 - 快速回答

在我回答后,我继续阅读 tabtab 的源代码,并注意到我也可以运行

 pkgname completion install 

安装完成。由于我的环境已经很混乱,我不知道它是否真的有用,但在我看来好像确实有用。

更详细的回答

@CameronLittle提供了很好的文档。

对于急性子的人,您可以先运行以下命令:

sudo bash -c 'pkgname completion > /etc/bash_completion.d/pkgname'
source /etc/bash_completion.d/pkgname

这将为您当前的Bash会话添加完成功能。
据我所知,新会话将自动获得完成功能。
为了使用户的过程更加无缝,您可以在package.json中使用install和postinstall钩子。

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

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

重要!只从主分支安装tabtab

看起来tabtab有一个恼人的bug,在主分支中已经解决了,但从未发布过...
修复它的相关提交是: https://github.com/mklabs/node-tabtab/commit/f8473555bf7278a300eae31cbe3377421e2eeb26 它处理以--开头的字符串的完成。
这个提交是来自2014年2月,然而截至(2015年1月)最新的版本是2014年1月的0.0.2版本...我认为不会再有更多的版本发布。
因此,如果你想得到这个修复程序,并且你应该(!),只从主分支安装tabtab。
别像我一样浪费两个小时去弄明白你做错了什么 :)

我如何得出这个答案?简短版

虽然@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)
#

这句话 "this file is coming directly from isaacs/npm repo" 让我更加好奇。根据这里其他答案的建议,我查看了 /etc/bash_completion.d/npm 文件,发现内容完全一样,于是有了这个评论。

我决定运行

pkgname completion > /etc/bash_completion.d/pkgname

然而这需要sudo权限,因此变得

sudo bash -c "pkgname completion > /etc/bash_completion.d/pkgname

接着,为了将其应用于当前的bash会话,我必须运行以下命令:

 source /etc/bash_completion.d/pkgname

完成了!它起作用了!

当我尝试打开另一个终端时,它仍然有效,因此我认为它将适用于所有用户。如果不是这样的话 - 您应该将其添加到.bashrc或其他文件中。


4
我只想补充一点,有一个npm包yargs可以为命令和选项启用bash-completion快捷方式。
它有输出.bashrc完成脚本的选项。然后通过源代码生成的脚本启用Bash完成。
它是目前在npm上积极维护的包,每月下载量超过100万。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接