来自help compgen:
$ help compgen
compgen: compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
Display possible completions depending on the options.
Intended to be used from within a shell function generating possible
completions. If the optional WORD argument is supplied, matches against
WORD are generated.
Exit Status:
Returns success unless an invalid option is supplied or an error occurs.
Run Code Online (Sandbox Code Playgroud)
选项[-abcdefgjksuv]代表什么?
换句话说,我想知道如何使用所有选项。
一些的git命令有很多选择,而且常常是通过他们的一个我需要寻找有用的-我只是在寻找它控制选项TAB的宽度git-gui,但也有大约200完成为git config。一个明显的解决方法是将所有补全复制到编辑器中并搜索它们,但我宁愿这样做
[something] | grep tab
Run Code Online (Sandbox Code Playgroud)
没有man或info页面compgen,help compgen甚至没有解释它自己的选项,并且没有自动完成 for compgen(讽刺的是如何?)。
PS:compgen -A不起作用。
PPS:这不是一个问题git-gui-标签宽度问题的解决方案在别处。
PPPS:这与自动完成命令无关,仅与命令参数有关。
是否有命令可以在 zsh 上获取内置命令?例如,可以使用compgen -bbash shell 中的命令获取所有内置命令。
作为我正在编写的更大的自动完成功能的一部分,我想使用 compgen 生成文件列表。我阅读了compgenand的 bash 手册条目complete,从那里我认为该选项-G "*"将是解决方案。但是,我无法让它工作:无论我的输入如何,都会显示当前目录中的文件列表,即:
$ cmd <Tab>
aa bb cc
$ cmd a<Tab>
aa bb cc
$ cmd aa<Tab>
aa bb cc
Run Code Online (Sandbox Code Playgroud)
因此,我尝试通过使用来调试它complete,它支持与 compgen 相同的选项,但我得到了相同的结果:
$ complete -G "*" cmd
$ cmd a<Tab>
aa bb cc
Run Code Online (Sandbox Code Playgroud)
我也试过complete -o filenames,但这也不起作用..
我有一个简单的 bash 完成脚本,它基本上调用我的(非 bash)程序并将其输出设置为COMREPLY,即
COMPREPLY=( $(my-program -- "${COMP_WORDS[@]}") )
Run Code Online (Sandbox Code Playgroud)
一些选项接受逗号分隔值,有没有办法只处理最后一项的建议?假设用户键入-v opt1,opt2,o<TAB><TAB>,假设我的程序此时发现有效选项是opt3or opt4。如果我只返回那些 2 并按 TAB,输出将更改为o(整个前缀消失)。如果我返回opt1,opt2,opt3and opt1,opt2,opt4,它会起作用,但这看起来不太好。
可行的办法是做类似的东西猛砸完成了逗号分隔值,也就是调用my-program生成[opt3, opt4],并传递作为单词表compgen与opt1,opt2,作为前缀。但这需要在 bash 脚本中复制一些逻辑,如my-program. 有没有更好的办法?
有许多可用资源(1、2、3)解释了如何利用 bash 自动完成命令和参数的能力,但所有这些资源都需要向用户添加代码,~/.bash_profile或者/etc/bash_completion.d/*有没有办法使一个脚本及其可用的完成是独立的?作为一个粗略和不完整的例子:
~/bin/script-with-integrated-autocomplete.sh:
#!/usr/bin/env bash
function _completions {
complete ...
}
if [ "$1" == "completions" ]; then
_completions
exit 0
fi
# (Whatever the script really does goes here.)
# ...
# ...
Run Code Online (Sandbox Code Playgroud)
交易破坏者(在这个问题的上下文中)是上面的例子仍然需要你添加类似的东西~/bin/script-with-integrated-autocomplete.sh completions来.profile完成。
有没有办法让单个 bash 脚本(文件)声明自己的完成并让 bash在调用时识别它们(理想情况下没有额外的系统或环境设置)?