C 彩色读线提示中断控件-a
下面的程序打印彩色的readline提示符。它会打断control-a(光标向右移动的距离远超过其应有的距离): 我正在使用MacOSX10.9.4。以下是耳石的输出:C 彩色读线提示中断控件-a,c,macos,readline,C,Macos,Readline,下面的程序打印彩色的readline提示符。它会打断control-a(光标向右移动的距离远超过其应有的距离): 我正在使用MacOSX10.9.4。以下是耳石的输出: /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 versio
/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
有几个问题似乎涉及到这一点:
它们都提到颜色标记需要用\001和\002括起来。我按照这些说明进行操作,但control-a仍处于中断状态。Mac OS X使用NetBSD
editline
库,其中包括readline
的部分兼容性实现
似乎有人试图添加readline的功能,即允许用户在提示符中使用字符RL\u prompt\u START\u IGNORE
和RL\u prompt\u END\u IGNORE
(分别在readline.h
中定义为'\1'
和'\2'
)。不幸的是,由于一个小的输入错误,该功能从未在rl\u initialize
中启用
当我阅读代码时(我还没有测试过),修复方法是将readline.c
[参见注释1]的第327行更改为:
el_set(e, EL_PROMPT, _get_prompt, RL_PROMPT_START_IGNORE);
致:
这将需要您找到libedit
的源代码,进行简单的更改,重新配置和重新编译,然后安装它。我没有Mac电脑,所以我无法指导你完成这个过程。(有关可能有用的源存储库的链接,请参见注释1。)
另一个解决方案是在项目中使用GNU readline库。它显然在MacPorts中可用,所以如果您使用它,安装起来应该很容易
笔记:
EL\u提示符
应该很容易找到。只需确保符号EL_PROMPT_ESC
是在histedit.h
中定义的;如果不是,您找到的editline库的版本可能太旧了我无法重现您的问题(在Linux Mint上使用
libreadline6 dev
,6.3-4ubuntu2)。我使用您的代码得到一个红色提示,但是Ctrl+a在有颜色和没有颜色的情况下都可以正常工作。我确实在“Colorized output breaks linewrapping with readline”中的代码中遇到了一些包装问题,所以至少我可以重现他的问题。可能添加库版本和其他详细信息有助于跟踪它。在shell级别,您需要在提示字符串中的任何非打印转义序列周围放置\[
和\]
。看见我确信有一些等价物可以直接使用readline,但我现在还不知道。@anol,谢谢你的评论。我试图在我的UbuntuLinux机器上重现这个问题,但无法——控制——a正常工作。引起我问题的机器是我的Mac(运行10.9.4)。我不相信我已经在它上面安装了新版本的libreadline,所以它看起来像一个库存库。下面是otool:/usr/lib/libreadline.dylib:/usr/lib/libedit.3.dylib(兼容版本2.0.0,当前版本3.0.0)/usr/lib/libncurses.5.4.dylib(兼容版本5.4.0,当前版本5.4.0)/usr/lib/libSystem.B.dylib的输出(兼容性版本1.0.0,当前版本1197.1.1列计数与C、Ruby、python等无关。列计数/换行严格来说是终端驱动程序的一个功能。如果不是其他,可以通过命令行向终端驱动程序发出命令,告诉终端驱动程序如何处理转义序列。@user3629249:事实并非如此。终端仿真器(而不是驱动程序)确实执行列计数和换行等操作。但它不会将列位置报告回写入终端的进程,因此,如果该进程需要知道某个特定字符在屏幕上的显示位置,它需要跟踪列位置本身。这就是为什么编写readline/editline之类的库非常烦人的原因。Wo可以用固定库替换本机Mac库吗?或者我可以以某种方式将固定版本静态链接到特定的二进制文件吗?我正在尝试在mysql提示符中使用颜色,这个问题让它变得非常不方便。我没有用readline重新编译mysql的专业知识(谷歌建议不再支持它)。
/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
el_set(e, EL_PROMPT, _get_prompt, RL_PROMPT_START_IGNORE);
el_set(e, EL_PROMPT_ESC, _get_prompt, RL_PROMPT_START_IGNORE);