如何使用gflags为您自己的项目获取bash选项卡完成?

时间:2015-09-14 00:29:24

标签: c++ bash autocomplete gflags

我刚刚开始使用gflags来处理我正在进行的几个C ++项目。我发现--help会返回大量的标记,我现在正在使用myapp --help | less来查找我正在寻找的标记。我很乐意为此完成制表。

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

问题

  1. 是否有gflags_completion.sh的文档以及如何使用它? gflags_completions.h.in
  2. 如何使用gflags_completion.sh脚本为自己的应用程序创建完成条目? (见下面的答案)
  3. 最小例子: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 个答案:

答案 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;是一个新编译的二进制文件,这应该仍然是   产生预期的完成产出。