Bash автозаполнение опции без запуска приложения - PullRequest
0 голосов
/ 18 сентября 2018

Я нашел этот код как автозаполнение bash. Но это выглядит странно для меня. Что делать, если я не люблю запускать код вообще. Если я хочу набрать ./a.out, затем пробел (без ввода), а затем нажать клавишу табуляции, я хотел бы видеть только две опции 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 ]

0 голосов
/ 19 сентября 2018

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

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

Схематически:

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

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

0 голосов
/ 18 сентября 2018

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

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

...