我刚刚开始使用gflags来处理我正在进行的几个C ++项目。我发现--help会返回大量的标记,我现在正在使用myapp --help | less
来查找我正在寻找的标记。我很乐意为此完成制表。
今晚我在glag的git存储库中发现了files for completion。并且命令gflags_completions.sh
已经在我的bash环境中使用gflags安装。
问题
最小例子:myapp.cc
要编译此文件,请运行g++ -o myapp myapp.cc -lgflags
。
/** GFlags test app for tab completion.
* License: Creative Commons 4.0 Attribution
* Compile with:
* g++ -o myapp myapp.cc -lgflags
*/
#include <gflags/gflags.h>
int main(int argc, char **argv) {
google::ParseCommandLineFlags(&argc, &argv, true);
return 0;
}
我认为应该有效
在complete命令上读了一下之后,我相信这应该有效,但我没有成功。
$ complete -o nospace -C \
'/usr/local/bin/gflags_completions.sh --tab_completion_columns $COLUMNS' \
time env myapp
$ ./myapp -[TAB]
答案 0 :(得分:1)
好的,在朋友的帮助下,我找到了文件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>
(等)
可悲的是,似乎bash没有给出强迫这种行为的简单方法 对于所有命令。那是&#34;时间&#34;在上面 例子来了。如果你还没有特别添加一个 命令到完成支持的命令列表,你 仍然可以通过为整个前缀添加前缀来完成 使用&#34; env&#34;命令。
$ env /some/brand/new/binary --vmod<TAB>
假设&#34;二进制&#34;是一个新编译的二进制文件,这应该仍然是 产生预期的完成产出。