Я нашел этот код как автозаполнение 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;
}
Это не имеет ничего общего с вашим исполняемым файлом. Вы должны поместить это в файл и источник (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
Вот хорошая документация может быть найдена.
// частичный ответ — почему вы можете вызвать приложение во время автозаполнения
Один из способов реализации автозаполнения для приложения состоит в том, чтобы настроить двоичный файл приложения на него (имея флаг, который печатает инструкции для конфигурации автозаполнения, или просто анализируя --help
вывод приложения).
Schemataically:
complete -F $(./a.out --generate-autocomplete-config) ./a.out
Вот почему вы можете увидеть, что двоичный файл действительно вызывается как часть реализации автозаполнения.