2015-09-14 43 views
1

我刚开始使用gflags来处理我正在处理的几个C++项目。我发现--help会返回大量的标志,而且我正在使用myapp --help | less来查找我正在查找的标志。我很想为此选项卡完成。如何使用gflags让自己的项目获得bash选项卡完成项?

今晚我在glat的git仓库中发现了files for completion。并且命令gflags_completions.sh已经用gflags安装在我的bash环境中。

问题

  1. 是否有gflags_completion.sh以及如何使用它的任何文档? ,gflags_completions.h.in
  2. 如何使用gflags_completion.sh脚本为我自己的应用程序创建完成条目? (见下面的答案):

小例子: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] 

相关问题:How does bash tab completion work?

+1

“这可能是一些非常类似的关于bash自动完成的问题” - 如果您在发布问题之前没有真正搜索重复项,则应该自己做,然后将问题标记为重复你自己,如果你觉得它的价值有这个问题。而不是要求他人为你找到重复的信息。 –

+1

嗨克里斯,谢谢你指出 - 我用的语言非常挑衅。我意识到现在:)我已经浏览了重复的候选人,并且gflags_completions AFAIK上没有任何其他内容。我相信我们可以证明有这个问题,只要我们得到几个编辑。 – Trygve

+0

好吧,只是检查:) –

回答

1

OK,从朋友一些帮助,我发现文件gflags_completions.h.in哪里此功能的文档。我在这个答案的末尾粘贴了一部分头文件。

上面我的问题缺少什么,是gflags_completions.h的失败声明。

最小工作示例:myapp。立方厘米

/** 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终端:从gflags_completions.h.in

$ ./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 

Snipplet:

$ 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 

所产生的输出是:

如何有庆典从二进制接受完井:

猛砸需要将其有关各命令编程 完成应该启用通知。例如除的.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)

不幸的是,它appe ars说bash并没有简单的方法来强制所有命令的这种行为 。这就是上述 示例中的“时间”出现的位置。如果您尚未明确将 命令添加到完成支持的命令列表中,则 仍可通过在“env”前加上整个 命令来完成。

$ env /some/brand/new/binary --vmod<TAB>          

假设“二进制”是新编译的二进制,这应该还是
产生预期的完成输出。

相关问题