gpt4 book ai didi

彩色 readline 提示符会中断 control-a

转载 作者:行者123 更新时间:2023-12-02 08:26:51 25 4
gpt4 key购买 nike

以下程序打印彩色的 readline 提示。它破坏了 control-a(光标最终比它应该的更靠右):

#include <readline/readline.h>
#include <readline/history.h>

#define CYELLOW "\001\e[0;31m\002"
#define RESET "\001\e[0m\002"

int main(int argc, char **argv)
{
readline(CYELLOW "prompt> " RESET);
return 0;
}

当我在没有彩色提示的情况下调用 readline() 时,control-a 起作用:

readline("prompt> ");

我使用的是 Mac OS X 10.9.4。这是 otool 的输出:

/usr/lib/libreadline.dylib:
/usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1

有几个 stackoverflow 问题似乎涉及到这个问题:

他们都提到颜色标记需要用\001 和\002 括起来。我按照这些说明进行操作,但 control-a 仍然损坏。

最佳答案

Mac OS X 使用 NetBSD editline 库,其中包括 readline 的部分兼容性实现。

似乎已尝试添加 readline 的功能,允许用户使用字符 RL_PROMPT_START_IGNORERL_PROMPT_END_IGNORE(定义为 '\1''\2' 分别在 readline.h 中)。不幸的是,由于一个小错字,该功能从未在 rl_initialize 中启用。

当我阅读代码时(我还没有测试过),修复方法是更改​​ readline.c 的第 327 行 [见注释 1] 来自:

el_set(e, EL_PROMPT, _get_prompt, RL_PROMPT_START_IGNORE);

到:

el_set(e, EL_PROMPT_ESC, _get_prompt, RL_PROMPT_START_IGNORE);

这将需要您找到 libedit 的源代码,进行微不足道的更改,重新配置和重新编译,然后安装它。我没有 Mac,所以无法指导您完成该过程。 (有关指向可能有用的源存储库的链接,请参阅注释 1。)

另一种解决方案是在您的项目中使用 GNU readline 库。它显然在 MacPorts 中可用,因此如果您使用它,它应该很容易安装。


注意事项:

  1. 我从这个 OS X source repository 得到了行号.在head revision of the NetBSD distribution ,它位于第 337 行。但是通过搜索 EL_PROMPT 应该很容易找到它。只需确保在 histedit.h 中定义了符号 EL_PROMPT_ESC;如果不是,则您找到的 editline 库的版本可能太旧。

关于彩色 readline 提示符会中断 control-a,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31329952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com