GNU自动完成变量

时间:2017-08-31 18:34:50

标签: c linux autocomplete gnu libreadline

我正在开发一个带有C语言提示的Linux工具。我已经使用GNU库启用了“function”和“file”。现在我想扩展对“变量”名称完成的支持。以下是更好理解的示例:

工作输出:

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 个答案:

答案 0 :(得分:0)

(只是一个猜测,因为你没有像你真的那样展示你的rl_attempted_completion_function函数)

您可能还应该使用rl_line_bufferrl_pointrl_end个全局变量(由readline修改,您只希望对它们具有读取权限。)

仔细阅读(和几次)关于custom completers的章节。

顺便说一句,你几乎肯定应该使用startend dv_complete_func的参数(假设你把它放在rl_attempted_completion_function中)

NB。我在github上的(已解散的)minil项目中尝试了这些想法。可悲的是,所有的评论和变数都有法语(因为它是为了说服一位法国退休人工智能研究员而写的)。是的,readline API 非常巴洛克式(你也应该研究使用它的程序的源代码,特别是GNU bash)。也许您应该考虑使用其他库...(查看ncurses并查看this问题和其他库)