Я нашел этот код как автозаполнение bash. Но мне это кажется странным. Что делать, если мне вообще не нравится запускать код. Если я хочу ввести ./a.out, затем пробел (без ввода), а затем, нажав табуляцию, я хотел бы увидеть только два варианта: apple и cherry, и если я наберу {{X3} } и нажмите вкладку, затем автозаполнение параметра 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
ar2015 18 Сен 2018 в 15:26

2 ответа

Лучший ответ

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

Здесь можно найти интересную документацию.

1
ar2015 19 Сен 2018 в 07:51

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

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

Схематично :

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

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

1
bobah 19 Сен 2018 в 08:00