2015-10-26 60 views
4

我能夠給用戶輸入限制爲5個字符使用GNU readlinereadline的使用默認值

#include <readline/readline.h> 
#include <stdio.h> 
#include <stdlib.h> 

static int limit_rl(FILE *f) 
{ 
    if (rl_end > 5) { 
     return '\b'; 
    } 
    return rl_getc(f); 
} 

int main(void) 
{ 
    char *str; 

    rl_getc_function = limit_rl; 
    str = readline("> "); 
    printf("%s\n", str); 
    free(str); 
    return 0; 
} 

但是,如何讀取默認值(不提示)輸入,如:

> ummy 
^cursor here 

如果用戶類型d輸入迴歸 「虛擬」

如果用戶類型DEL輸入返回「MMY」

+0

你的意思是'ummy'應該存在了嗎? – ameyCU

+3

查看'rl'示例 - 可以設置一次執行'rl_insert_text'的啓動鉤子('rl_startup_hook'),然後禁用它自己。 – usr2564301

+0

@ameyCU,是的,它必須出現在'rl_line緩衝區'和屏幕 –

回答

2

在一個可能的用途是提到的readline主頁:

rl.c是使用的ReadLine讀取輸入的來自線路的示例方案用戶並將其回顯到標準輸出,適用於shell腳本。

由於編輯一個現有的條目可能是其中的一部分,我決定看看它的源代碼(direct download link)。這確實顯示瞭如何將其顯示在屏幕上,通過使用鉤子函數的前插入一個字符串成readline使用的緩衝區:

變量:rl_hook_func_t * rl_startup_hook

如果非零,則這是在readline打印第一個提示之前要調用的函數的地址。
https://cnswww.cns.cwru.edu/php/chet/readline/readline.html#IDX223

內部鉤子函數可以直接操縱內部緩衝區,例如插入文本:

函數:int rl_insert_text常量字符*文本

插入文本進入當前光標位置處的行。返回插入的字符數。
https://cnswww.cns.cwru.edu/php/chet/readline/readline.html#IDX295

鉤子函數只需做一次(它被稱爲每readline調用一次內部readline_internal_setup),但顯然RL的作者去了皮帶和吊帶的做法,特別禁用它在它被使用之後。

rl.c相關片斷,評論,都是我的

/* a global char * to hold a default initial text */ 
static char *deftext; 

/* the callback function. The argument is supposed to be 'void' per 
    its declaration: 
     typedef int rl_hook_func_t (void); 
    so you cannot provide the default text here */ 
static int set_deftext() 
{ 
    if (deftext) 
    { 
     /* Apparently the "current cursor position" in which text is inserted 
     is 0, when initially called */ 
     rl_insert_text (deftext); 
     deftext = (char *)NULL; 

     /* disable the global 'rl_startup_hook' function by setting it to NULL */ 
     rl_startup_hook = (rl_hook_func_t *)NULL; 
    } 
    return 0; 
} 

// ... 
if (deftext && *deftext) 
    rl_startup_hook = set_deftext; 

temp = readline (prompt);