GNU Автозаполнение по переменным

Я разрабатываю инструмент для Linux с приглашением на C. Я включил завершение "function" и "file" с использованием библиотеки GNU. Теперь я хочу расширить поддержку до "переменного" дополнения имени. Ниже приведен пример для лучшего понимания:

РАБОЧИЙ ВЫХОД:

build2:/u/anitha> linux_tool
loading history
tool> 
tool> ***On pressing TAB twice, the functions are prompted***
Display all 251 possibilities? (y or n)
byte(        
dim(    
fncc_fft2d(   
HasValue(      
ifft(
load_csv(

ОЖИДАЕМЫЕ ДОПОЛНИТЕЛЬНАЯ ПОДДЕРЖКА:

tool> **var_name**=create(2,2)
2x2x1 array of int, bsq format [16 bytes]
0       1
2       3
tool>
tool> ***on pressing TAB twice, I want the variable name to be prompted for auto completion. i.e.**,*
tool> var_
**var_name**
Version(

Код добавлен для автозаполнения:

char ** dv_complete_func(char *text, int start, int end);
char *dv_complete_func_generator(const char*, int);
extern struct _vfuncptr vfunclist[];
  /* This array has the list of functions that the tool can support */

char **
dv_complete_func(char *text, int start, int end)
{
  return rl_completion_matches(text, dv_complete_func_generator);
}


char *dv_complete_func_generator(const char *text, int state) 
{
    static int list_index, len;
    char *name;

    if(!state) {
        list_index =0; 
        len=strlen(text);
    }   

    while((name = vfunclist[list_index++].name)) {
        if(strncmp(name,text,len)==0) {
             char *namedup = strdup(name);
             strcat(namedup,"(");
            return strdup(namedup);
        }   

    }   
    return NULL;
}

Дайте мне знать, если вопрос неясен. Пожалуйста, помогите мне с решением.

1 ответ

(Просто предположение, так как вы не показываете свою функцию, связанную с rl_attempted_completion_function как ты и вправду должен)

Вы, вероятно, должны также использовать rl_line_buffer, rl_point, rl_end глобальные переменные (измененные readline, вы хотите только читать доступ к ним).

Прочитайте внимательно (и несколько раз) главу о пользовательских комплектующих.

Кстати, вы почти наверняка должны использовать start а также end аргументы dv_complete_func (при условии, что вы положили это в rl_attempted_completion_function)

NB. Я экспериментировал с этими идеями в моем (несуществующем) мини- проекте на github. К сожалению, все комментарии и переменные есть на французском языке (потому что он был написан, чтобы убедить французского исследователя ИИ в отставке). И да, readline API очень барочный (и вам также следует изучить исходный код программ, использующих его, особенно GNU bash). Может быть, вам стоит подумать об использовании какой-нибудь другой библиотеки... (посмотрите ncurses и посмотрите этот вопрос и другие библиотеки)

Другие вопросы по тегам