2

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

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

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

我在 Internet 上找到的所有示例(例如以下示例)看起来都应该首先运行程序,然后它会做出反应。函数内部的 while 循环main与程序的正常功能发生冲突。我误解了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;
}
4

2 回答 2

2

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

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

示意图:

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

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

于 2018-09-19T08:00:22.063 回答
1

这与您的可执行文件无关。您需要将它放在一个文件中,并将它的源(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

在这里可以找到一个很好的文档。

于 2018-09-18T12:41:58.283 回答