好的,在朋友的帮助下,我找到了gflags_completions.h.in文件,其中包含此功能的文档。我在这个答案的末尾粘贴了部分头文件。
我上面的问题中缺少的是gflags_completions.h
.
最小的工作示例:myapp.cc
/** GFlags test app for tab completion.
* License: Creative Commons 4.0 Attribution
* Compile with: g++ -o myapp myapp.cc -lgflags
*/
#include <gflags/gflags.h>
#include <gflags/gflags_completions.h>
int main(int argc, char **argv) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
return 0;
}
要对此进行测试,请在 bash 终端中执行以下步骤:
$ g++ -o myapp myapp.cc -lgflags # Compile the example.
$ which gflags_completions.sh # Check the path of gflags_compl...
/usr/local/bin/gflags_completions.sh # I use this path below.
# Tell bash to use autocomplete for myapp.
$ complete -o bashdefault -o default -o nospace -C \
'/usr/local/bin/gflags_completions.sh --tab_completion_columns $COLUMNS'\
time env myapp
结果输出是:
$ ./myapp -[TAB]
~
-----------------
--flagfile [''] load flags from file
--fromenv [''] set flags from the environment [use 'export FLAGS_f'...
--help [false] show help on all flags [tip: all flags can have two ...
--helpfull [false] show help on all flags -- same as -help
--helpmatch [''] show help on modules whose name contains the speci...
--helpon [''] show help on the modules named by this flag value
--helppackage [false] show help on all modules in the main package
--helpshort [false] show help on only the main module for this program
--helpxml [false] produce an xml version of help
-* Other flags *-
--tab_completion_columns [80] Number of columns to use in output fo...
--tab_completion_word [''] If non-empty, HandleCommandLineCompletio...
--tryfromenv [''] set flags from the environment if present
--undefok [''] comma-separated list of flag names that it is okay t...
--version [false] show version and build info and exit
来自gflags_completions.h.in的片段:
如何让 bash 接受来自二进制文件的补全:
Bash 要求通知它应该启用编程完成的每个命令。.bashrc 文件的示例添加将是(您的 gflags_completions.sh 文件的路径可能不同):
$ complete -o bashdefault -o default -o nospace -C \
'/home/build/eng/bash/bash_completions.sh --tab_completion_columns $COLUMNS'\
time env binary_name another_binary [...]
这将允许以下工作:
$ /path/to/binary_name --vmodule<TAB>
或者:
$ ./bin/path/another_binary --gfs_u<TAB>
(ETC)
可悲的是,bash 似乎没有简单的方法来强制所有命令执行此行为。这就是上面示例中的“时间”的用武之地。如果您没有专门将命令添加到支持完成的命令列表中,您仍然可以通过在整个命令前加上“env”来获得完成。
$ env /some/brand/new/binary --vmod<TAB>
假设“二进制”是一个新编译的二进制文件,这仍应
产生预期的完成输出。