Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 彩色读线提示中断控件-a_C_Macos_Readline - Fatal编程技术网

C 彩色读线提示中断控件-a

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

下面的程序打印彩色的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 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中可用,所以如果您使用它,安装起来应该很容易


笔记:
  • 我从这里得到了电话号码。在第二行,在337行。但通过搜索
    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);