以下程序打印彩色的readline提示.它打破了控制-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;
}
Run Code Online (Sandbox Code Playgroud)
control-a在我没有彩色提示时调用readline()时起作用:
readline("prompt> ");
Run Code Online (Sandbox Code Playgroud)
我正在使用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
Run Code Online (Sandbox Code Playgroud)
有几个stackoverflow问题似乎涉及到这个:
他们都提到颜色标记需要被\ 001和\ 002括起来.我遵循了那些指示,但控制权仍然被打破了.
Mac OS X使用NetBSD editline库,其中包括部分兼容性实现readline.
似乎尝试添加readline的功能,允许用户使用字符RL_PROMPT_START_IGNORE和RL_PROMPT_END_IGNORE(分别定义为'\1'和'\2'分别readline.h)在提示中括起终端控制序列.不幸的是,由于一个小错字,该功能从未启用rl_initialize.
当我阅读代码时(我还没有测试过这个),修复方法是更改readline.c[参见注释1]的第327行:
el_set(e, EL_PROMPT, _get_prompt, RL_PROMPT_START_IGNORE);
Run Code Online (Sandbox Code Playgroud)
至:
el_set(e, EL_PROMPT_ESC, _get_prompt, RL_PROMPT_START_IGNORE);
Run Code Online (Sandbox Code Playgroud)
这将要求您找到源代码libedit,进行简单的更改,重新配置和重新编译,然后安装它.我没有Mac,所以我无法指导您完成整个过程.(有关可能有用的源存储库的链接,请参阅注释1.)
另一种解决方案是在项目中使用GNU readline库.它显然可以在MacPorts中使用,所以如果你使用它,它应该很容易安装.
EL_PROMPT.只需确保符号EL_PROMPT_ESC定义在histedit.h; 如果不是,您找到的editline库的版本可能太旧了.| 归档时间: |
|
| 查看次数: |
572 次 |
| 最近记录: |