Bash 自动完成一个选项,而不运行应用程序

Bash autocomplete an option without running the application

本文关键字:选项 一个 应用程序 运行 Bash      更新时间:2023-10-16

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

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

其中applecherry是选项,而不是目录中文件的名称。在第一种情况下,我希望your option is apple的程序类型,在第二种情况下your option is 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;
}

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

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

示意图:

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

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

这与可执行文件无关。你需要把它放在一个文件中,并在bash中获取(source autocomplete_file. autocomplete_file(。

_a_complete_()
{
local word=${COMP_WORDS[COMP_CWORD]}
local files='apple cherry'
COMPREPLY=( $( compgen -W "${files}" -- ${word} ) )
}
complete -F _a_complete_ ./a.out

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

相关文章: