2017-08-31 109 views
0

我正在用C語言提示開發一個Linux工具。我使用GNU庫啓用了「函數」和「文件」完成。現在我想將支持擴展到「可變」名稱完成。下面是更好地理解的例子: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; 
} 

讓我知道如果這個問題還不清楚。請幫助我解決方案。

+4

是的,問題是不清楚的。 – Yunnosch

+0

顯示您的實際代碼。你在正確的軌道上。 *顯示綁定到'rl_attempted_completion_function'的函數的源代碼*。所以**編輯你的問題**以改善它很多。 –

+0

我希望「變量完成」也可以擴展爲變量。也就是說,如果我在提示中創建了一個變量,那麼「在按下選項卡」時,它也應該顯示與函數名稱不同的變量。 – Krish

回答

0

(只是猜測,因爲你不顯示綁定到rl_attempted_completion_function你的功能你真的應該)

你或許應該還可以使用rl_line_bufferrl_pointrl_end全局變量(由readline修改,則只想讀取它們)。

仔細閱讀(和多次)關於custom completers的章節。

順便說一句,你幾乎可以肯定應該使用startend參數dv_complete_func(假設你把在rl_attempted_completion_function

NB。我在github的(停止)minil項目中圍繞這些想法做了實驗。可悲的是,所有的評論和變數都是法文的(因爲它是爲了說服法國退休的AI研究員)。是的,readline API是巴洛克(你也應該學習使用它的程序的源代碼,特別是GNU bash)。也許你應該考慮使用一些其他的圖書館......(看看ncurses和看到this問題和其他圖書館)

+0

我剛剛添加了代碼片段。你能檢查一次嗎? – Krish

+0

感謝您的回覆。我一定會閱讀你提到的那一章。我有兩個問題: 1.我的主要疑問是從哪裏選擇變量名?對於函數的自動完成,我有一個要遍歷的數組「vfunclist」。但是對於已經聲明/定義的變量,我不確定應該遍歷哪個列表,以便在自動完成時列出它們。 2.你能推薦我可以使用的更好的圖書館嗎? – Krish

+0

變量名稱將僅由您已寫入的函數*選取。這個功能的作用取決於你。 –