具有默认值的 readline

2024-02-09

我可以使用以下命令将用户输入限制为 5 个字符GNU 阅读线 https://cnswww.cns.cwru.edu/php/chet/readline/rltop.html:

#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

if user types d and Enter return "dummy"

if user types DEL and Enter return "mmy"


在主页上readline提到了一种可能的用途:

rl.c是一个示例程序,它使用 Readline 读取用户的一行输入并将其回显到标准输出,适合 shell 脚本使用。

由于编辑现有条目很可能是其中的一部分,因此我决定查看其源代码(直接下载链接 https://cnswww.cns.cwru.edu/php/chet/readline/rl.c)。这确实展示了如何将字符串插入到使用的缓冲区中readline before它出现在屏幕上,通过使用钩子函数:

变量:rl_hook_func_t *rl_startup_hook

如果非零,则这是之前调用的函数的地址readline打印第一个提示。
(https://cnswww.cns.cwru.edu/php/chet/readline/readline.html#IDX223 https://cnswww.cns.cwru.edu/php/chet/readline/readline.html#IDX223)

在钩子函数内,您可以直接操作内部缓冲区,例如插入文本:

函数:整数rl_插入_文本 (常量字符*文本)

Insert text进入当前光标位置的行。返回插入的字符数。
(https://cnswww.cns.cwru.edu/php/chet/readline/readline.html#IDX295 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有默认值的 readline 的相关文章

随机推荐

  • Wear OS 和 iOS 配套应用程序之间的直接通信

    我目前有一个适用于 Android 和 iOS 智能手机的应用程序 我想将其引入 Wear OS 和 Watch OS 由于 Wear OS 智能手表也与 iOS 设备兼容 因此我正在寻找一种在 Watch OS 应用程序和 iOS 应用程
  • 在表格/班级之间共享信息[重复]

    这个问题在这里已经有答案了 我知道标题问题并不独特 并且有很多可用的消息 我打开一个线程的原因是我真的很难根据我的项目来理解这个问题 最近 我尝试启动 WinForm 以从 REST API 获取值 就像在 Form1 上进行开始测试一样
  • 使用 dplyr::percent_rank() 计算组内的百分位数排名

    假设我有以下数据 id grpvar1 grpvar2 value 1 1 3 7 6 2 1 2 4 3 1 5 2 对于每个id 我想计算percent rank of its value在由组合定义的组内grpvar1 and grp
  • Windows ODBC 驱动程序 - 检索的表情符号数据呈现为?

    重复线程注释 我已经针对这个问题提出了类似的问题 通过 ODBC 连接检索的表情符号数据显示为问号 https stackoverflow com questions 58943772 emoji data retrieved via od
  • 聚合函数和其他列

    SQL 查询是否可以返回一些普通列和一些聚合列 like Col A Col B SUM 5 6 7 您应该使用按语句分组 http www w3schools com sql sql groupby asp GROUP BY 语句用于 与
  • 恢复活动时防止多次打开对话框

    在我的 Android 应用程序中 为了询问用户是否要恢复当前游戏 我在主游戏活动中显示一个对话框 显示 您要恢复当前游戏吗 是 否 问题是 如果我在不回答对话的情况下多次恢复此活动 那么我会收到几个对话 一个个对话 这显然不是我的目标 我
  • 如何将 XPath 与 AS3 结合使用并获得仍然引用 XMLDocument 对象的结果?

    我正在将 XML 字符串解析为 XMLDocument 对象 我想使用 XPath 技术搜索特定节点XPathQuery execQuery 此函数返回新的 XML 对象 这意味着我需要将其转换为不同的 XMLDocument 对象并丢失引
  • 升级到 Grails 2.4.4 的问题

    从 Grails 2 4 3 升级到 2 4 4 后 启动 Grails 应用程序时不断出现错误 完整的错误可以在这里阅读 http pastebin com UXQ34JKD http pastebin com UXQ34JKD 2014
  • javascript 的 Jquery 参数替代方案

    我需要转换以下类型字典 key1 value1 key2 value1 value2 to key1 value1 key2 即发布数据表格 我在 chrome 扩展中执行此操作 上面的表单数据字典由以下方式返回 chrome webReq
  • Facebook 无效范围错误

    我用 Rails 应用程序创建了一个 V2 3 的应用程序 4月30日前一切正常 现在我收到此错误 无效范围 offline access publish stream create event 朋友 活动 此消息仅向开发人员显示 用户 如
  • 如何判断虚拟地址在 ARM Linux 内核中是否具有有效映射?

    我想检查是否可以在不引发分段错误的情况下取消引用虚拟地址 我所说的虚拟地址不仅仅是不可信的用户空间地址 我也想检查内核虚拟地址 在 x86 Linux 内核中 可以使用 virt addr valid 函数来检查是否 虚拟地址具有有效的映射
  • std::launder 可用于将对象指针转换为其封闭数组指针吗?

    当前的标准草案 大概是 C 17 说 基本 化合物 4 http eel is c draft basic compound 4 注意 数组对象及其第一个元素不可进行指针互换 即使它们具有相同的地址 尾注 所以指向对象的指针不能reinte
  • 对 UTF-8 字符串进行排序?

    我的 std strings 以 UTF 8 编码 因此 std string 不切掉的地方是重音符号 出现在 z 后面 但它不应该出现在 z 后面 Thanks 如果您不需要字典顺序 这就是按字典顺序对 UTF 8 编码字符串进行排序的结
  • appsettings.json 文件不在 .net core 控制台项目中

    据我所知 net core 已将 app config 文件替换为 appsetting json 然而 这个文件似乎只是为 ASP net 项目添加的 事实上 它甚至在添加项目列表中不可用 我发现this https blog bitsc
  • 如何检测工作站锁

    我正在开发一个应用程序 并试图检测工作站何时被锁定 例如用户按下 Windows L 键 我知道锁定事件具有价值 WTS SESSION LOCK 0x7 但我不知道如何使用它 我在网上搜索过但一无所获 您应该使用SystemEvents
  • Rails - 带条件的 text_field 类

    我想根据条件给出一个 text field 类 有没有办法在 Rails 中做到这一点 I e 仅当发生某种情况时 我才需要 必需 该类 使用三元 condition then else 操作员 阅读起来并不
  • VS 2015:性能向导中禁用分析工具

    我想对应用程序的性能进行采样 但在尝试使用性能向导启动新的分析会话时 各种工具 例如 CPU 使用率和应用程序时间轴 不可用 我使用的是 Visual Studio 2015 专业版 该应用程序使用 ASP NET 5 RC1 并从 Kes
  • 自定义 Json(反)序列化?

    我正在将一些代码从 Net 移植到 python 有时 我们需要将任意复杂的 json 从一种格式转换为另一种格式 Eg Query Boolean Operator And Parameters Equal Name Bob Boolea
  • 打印 RDLC 报告而不显示 ReportViewer 控件

    我想知道是否可以发送 打印数据DataGridView直接到 rdlc 报告而不将其绑定到ReportViewercontrol 有许多关于将 dgv 数据绑定到报告查看器控件的线程 我不想创建另一个带有报表查看器控件的表单 而是使用带有数
  • 具有默认值的 readline

    我可以使用以下命令将用户输入限制为 5 个字符GNU 阅读线 https cnswww cns cwru edu php chet readline rltop html include