具有默认值的readline

时间:2015-10-26 11:05:36

标签: c readline

我可以使用GNU readline将用户输入限制为5个字符:

#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 并且输入则返回&#34; dummy&#34;

如果用户输入 DEL 输入返回&#34; mmy&#34;

1 个答案:

答案 0 :(得分: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 const char * 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);