Bash автозаполнение опции без запуска приложения

Я нашел этот код как автозаполнение Bash. Но это выглядит странно для меня. Что делать, если я не люблю запускать код вообще. Если бы я хотел напечатать ./a.out затем пробел (без ввода), а затем нажав клавишу Tab, я хотел бы видеть только два варианта apple а также cherry и если я наберу a и нажмите вкладку, затем он автоматически завершает опцию apple и аналогично для c, Допустим, приемлем только один из двух вариантов:

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

где apple а также cherry это параметры, а не имена файлов в каталоге. В первом случае я хотел бы, чтобы типы программ, которые your option is apple а во втором случае your option is cherry, В любом другом случае программа должна распечатать сообщение об ошибке, что опция недействительна.

Все примеры, которые я нахожу в Интернете, такие как следующее, выглядят так, что вы должны сначала запустить программу, а затем она реагирует. Цикл 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;
}

2

Решение

Это не имеет ничего общего с вашим исполняемым файлом. Вы должны поместить это в файл и источник (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

Вот хорошая документация может быть найдена.

1

Другие решения

// частичный ответ — почему вы можете вызвать приложение во время автозаполнения

Один из способов реализации автозаполнения для приложения состоит в том, чтобы настроить двоичный файл приложения на него (имея флаг, который печатает инструкции для конфигурации автозаполнения, или просто анализируя --help вывод приложения).

Schemataically:

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

Вот почему вы можете увидеть, что двоичный файл действительно вызывается как часть реализации автозаполнения.

1

По вопросам рекламы [email protected]