1

我刚刚开始在我正在处理的几个 C++ 项目中使用gflags 。我发现 --help 返回大量标志,我目前正在使用myapp --help | less它来查找我正在寻找的标志。我很想为此完成标签。

今晚我在 glags 的 git 存储库中发现了要完成的文件。并且该命令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 -o nospace -C \
  '/usr/local/bin/gflags_completions.sh --tab_completion_columns $COLUMNS' \
  time env myapp
$ ./myapp -[TAB]

相关问题:bash 选项卡完成如何工作?

4

1 回答 1

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>                                    

(ETC)

可悲的是,bash 似乎没有简单的方法来强制所有命令执行此行为。这就是上面示例中的“时间”的用武之地。如果您没有专门将命令添加到支持完成的命令列表中,您仍然可以通过在整个命令前加上“env”来获得完成。

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

假设“二进制”是一个新编译的二进制文件,这仍应
产生预期的完成输出。

于 2015-09-14T00:45:40.600 回答