You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为GhostScript添加Readline时,如何避免其清除外部提示符?

问题描述

我正尝试为GhostScript(Casperscript)添加Readline支持,目前整体功能正常,但存在一个问题:当输入若干字符后按退格键时,整行内容(包括GhostScript在调用gp_readline之前输出的提示符)会被全部清除。我已找到并添加了代码rl_already_prompted = (int)true,但相关文档指出,要让该设置正常生效,仍需将提示符文本作为readline的参数传入,这会带来很多冗余代码,正是我想避免的。请问有没有办法从终端获取提示符,或者其他更优雅的解决思路?

可行解决思路

  • 传入空字符串配合rl_already_prompted:直接给readline传空字符串"",同时保持rl_already_prompted = (int)true。Readline会识别到已手动输出提示符,不会重复打印,也不会将已输出的提示符纳入输入缓冲区,退格时仅清除用户输入的字符,不会影响之前打印的提示符。
  • 复用已输出的提示符内容:如果GhostScript的提示符是固定或可提前生成的,在手动输出提示符时将内容保存到全局变量,后续调用readline时直接传入该变量。比如:
    // 输出并保存提示符
    const char *prompt = "GS> ";
    fputs(prompt, stdout);
    fflush(stdout);
    static char saved_prompt[256];
    strncpy(saved_prompt, prompt, sizeof(saved_prompt) - 1);
    saved_prompt[sizeof(saved_prompt) - 1] = '\0';
    
    // 调用readline时传入保存的提示符
    rl_already_prompted = (int)true;
    char *input = readline(saved_prompt);
    
    这种方式既符合Readline的文档要求,又避免了重复编写提示符字符串的冗余。
  • 自定义Readline提示符回调:通过rl_set_prompt_func注册自定义回调函数,将GhostScript的提示符生成逻辑整合其中。Readline会自动调用该回调获取并打印提示符,无需手动提前输出,也不用在readline参数中重复传递。示例代码如下:
    // 自定义提示符生成回调
    char *gs_prompt_generator(void) {
        // 这里可以加入GhostScript动态生成提示符的逻辑
        return strdup("GS> ");
    }
    
    // 初始化时设置回调
    rl_set_prompt_func(gs_prompt_generator);
    
    // 后续直接调用readline
    char *input = readline(NULL);
    
    这种方式从根源上消除了提示符相关的冗余代码,同时保证Readline能正确识别提示符范围,退格操作仅作用于用户输入内容。

内容的提问来源于stack exchange,提问作者jcomeau_ictx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:15:20