Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Bash在不运行应用程序的情况下自动完成选项_C++_Linux_Readline_Libreadline - Fatal编程技术网

C++ Bash在不运行应用程序的情况下自动完成选项

C++ Bash在不运行应用程序的情况下自动完成选项,c++,linux,readline,libreadline,C++,Linux,Readline,Libreadline,我发现这段代码是bash自动完成的。但是,我觉得很奇怪。如果我根本不喜欢运行代码呢。如果我想键入/a.out然后输入空格(不输入),然后按tab键,我只想看到两个选项apple和cherry,如果我键入a并按tab键,它会自动完成选项apple,同样地,对于c。假设两个选项中只有一个是可接受的: ./a.out apple ./a.out cherry 其中,apple和cherry是选项,而不是目录中文件的名称。在第一种情况下,我希望程序类型您的选项是apple,在第二种情况下您的选项是ch

我发现这段代码是bash自动完成的。但是,我觉得很奇怪。如果我根本不喜欢运行代码呢。如果我想键入
/a.out
然后输入空格(不输入),然后按tab键,我只想看到两个选项
apple
cherry
,如果我键入
a
并按tab键,它会自动完成选项
apple
,同样地,对于
c
。假设两个选项中只有一个是可接受的:

./a.out apple
./a.out cherry
其中,
apple
cherry
是选项,而不是目录中文件的名称。在第一种情况下,我希望程序类型
您的选项是apple
,在第二种情况下
您的选项是cherry
。在任何其他情况下,程序都应打印一个错误,说明该选项无效

我在互联网上找到的所有例子,比如下面的例子,看起来都是你应该先运行这个程序,然后它会做出反应。
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;
}
//sudo apt get安装libreadline dev
//g++-std=c++11 main.cpp-lreadline
#包括
#包括“readline/readline.h”
#包括“readline/history.h”
使用名称空间std;
int main(int argc,字符**argv)
{
常量字符*行;
while((line=readline(“?”)!=nullptr){

cout这与您的可执行文件无关。您需要将其放入一个文件和源(
source autocomplete\u file
.autocomplete\u 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

您可以找到一个很好的文档。

//部分答案-为什么在执行自动完成时要调用应用程序

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

有计划地:

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

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

如果您想让bash自动完成,您需要配置bash自动完成。如果您想让您的程序有一个带有自动完成的命令行界面,readline是一个很好的库。通常bash完成不是作为t的一部分实现的选项已完成的可执行文件,但在一个单独的bash完成脚本中。您可能希望了解如何为一个非常简单的bash脚本创建完成。谢谢您的回答。此脚本对我不起作用。请重试。我为
a
而不是
a.out
制作了一个自动完成脚本。I更正了上面的错误。是的。非常感谢。非常聪明。非常感谢。