Bash 在没有 运行 应用程序的情况下自动完成选项

Bash autocomplete an option without running the application

我发现这段代码是 bash 自动完成的。但是,这对我来说看起来很奇怪。如果我根本不喜欢 运行 代码怎么办。如果我想输入 ./a.out,然后输入 space(无需输入),然后按 Tab,我只想看到两个选项 applecherry,如果我输入a 并按 Tab,然后它会自动完成选项 apple,对于 c 也是如此。假设两个选项中只有一个是可以接受的:

./a.out apple
./a.out cherry

其中 applecherry 是选项,而不是目录中文件的名称。在第一种情况下,我希望程序类型为 your option is apple,在第二种情况下,我希望程序类型为 your option is cherry。在任何其他情况下,程序都应该打印一个错误,指出该选项无效。

我在 Internet 上找到的所有示例(例如下面的示例)看起来都应该先 运行 程序,然后它才会做出反应。 main 函数内的 while 循环与程序的正常功能冲突。我是否误解了 readline 库?是否可以通过编辑以下代码实现上述应用?

// sudo apt-get install libreadline-dev
// g++ -std=c++11 main.cpp -lreadline

#include <iostream>

#include "readline/readline.h"
#include "readline/history.h"

using namespace std;

int main(int argc, char** argv)
{
    const char *line;
    while ((line = readline("? ")) != nullptr) {
        cout << "[" << line << "]" << endl;
        if (*line) add_history(line);
        free(line);
    }
// if(argc!=2)
// {
//  cout<<"<exe> one_parameter"<<endl;
//  return 1;
// }
// string option=argv[1];
// if(option=="apple" || option=="cherry")
//  cout<<"Your option is "<<option<<endl;
// else
// {
//  cout<<"Error: invalid option "<<option<<endl;
//  return 1;
// }

    return 0;
}

这与您的可执行文件无关。您需要将其放入文件中,并将其源代码(source autocomplete_file. autocomplete_file)放入 bash.

_a_complete_()
{
    local word=${COMP_WORDS[COMP_CWORD]}
    local files='apple cherry'

    COMPREPLY=( $( compgen -W "${files}" -- ${word} ) )
}

complete -F _a_complete_ ./a.out

Here 可以找到很好的文档。

// 部分答案 - 为什么您可能希望在执行自动完成时调用应用程序

为应用程序实现自动完成的一种方法是让应用程序二进制文件对其进行配置(通过打印自动完成配置指令的标志或仅解析应用程序的 --help 输出)。

示意图:

complete -F $(./a.out --generate-autocomplete-config) ./a.out

这就是为什么您可能会看到二进制文件作为自动完成实现的一部分实际调用的原因。