C++ 如何为编辑行应用程序的提示着色

C++ 如何为编辑行应用程序的提示着色,c++,c,colors,prompt,editline,C++,C,Colors,Prompt,Editline,我正在尝试对由驱动的应用程序的提示进行着色,但我发现颜色根本没有显示出来。知道我做错了什么吗 #include <iostream> #include <histedit.h> char* prompt(EditLine *e) { static char p[] = "\1\033[36m\1:::\1\033[0m\1 "; return p; } int main(int argc, char* argv[]) { EditLine* el = el

我正在尝试对由驱动的应用程序的提示进行着色,但我发现颜色根本没有显示出来。知道我做错了什么吗

#include <iostream>
#include <histedit.h>

char* prompt(EditLine *e)
{
  static char p[] = "\1\033[36m\1:::\1\033[0m\1 ";
  return p;
}

int main(int argc, char* argv[])
{
  EditLine* el = el_init(argv[0], stdin, stdout, stderr);
  el_set(el, EL_PROMPT_ESC, &prompt, '\1');
  el_set(el, EL_EDITOR, "vi");

  while (1)
  {
    int count;
    char const* line = el_gets(el, &count);

    if (count > 0)
      std::cout << line;
  }

  el_end(el);

  return 0;
}
不幸的是,只显示以下未着色的提示:

:::     

\1用作停止/启动文字字符,因此这似乎是正确的行为

\1\033[36m\1:::\1\033[0m\1
|          |   |         |
|          |   |_Start   |_Stop
|          |
|_Start    |_Stop
EL_PROMPT_ESC,字符*(*f)(编辑行*),字符c 与EL_提示符相同,但c参数表示 开始/停止文字提示字符

     If a start/stop literal character is found in the prompt, the
     character itself is not printed, but characters after it are
     printed directly to the terminal without affecting the state
     of the current line.  A subsequent second start/stop literal
     character ends this behavior.  This is typically used to
     embed literal escape sequences that change the color/style of
     the terminal in the prompt.  0 unsets it.
手册页说明使用
0
取消设置颜色,但有点不清楚它们的含义

也许可以尝试这样的转义序列:

\1\033[36m:::\033[0m\1

由于
\1
可能会终止颜色的使用,而
\[…\]
将是bash中的正常终止符。

esc[0m'重置所有属性,因此显示的颜色将立即消失,最好将属性设置为其他颜色,例如白色“esc[47m”


要获得更全面的属性列表,Editline不支持颜色提示。有一个实现它们的方法

有趣的是,在屏幕更新期间,editline首先在内存缓冲区中渲染图像,与前一帧不同,然后发出命令来修复差异。这些命令是
moveto(x,y)
delete(n)
insert(text)

这种设计允许使用更简单的代码。例如,编辑器中的insert命令可以并且实际上确实会重新绘制整个屏幕,但最终生成的终端绘制命令序列是最小的


不幸的是,由于文本在到达终端之前经历了复杂的转换,一些信息在翻译过程中丢失了,比如颜色。

有趣的是,
\1\[\033[36m\]\1::::\1\[\033[0m\]\1
给了我一个提示,
[[]]:
带着内部的
][
被着色。似乎
\1
终止了着色。实际上,使用
“\1\033[36m::\033[0m\1”,没有中间的转义字符,产生一个彩色提示符!当我使用一个彩色提示符时,退格键就不再工作了,它只是打印了转义字符到TTY。这里有什么问题吗?我相信整个问题是LiBeDIT中的一个bug。我已经联系过Christos Zoulas了。得到一个答案。@Chewi:谢谢你联系作者,如果这个问题得到解决,我会很激动的!对不起,我最终得到了回复,但忘记了这一切。“这是一个已知的错误(用于颜色提示)。它需要进行一些认真的工作才能得到修复,因为目前提示功能无法在正确的时间处理打印属性。我将对此进行研究。“不幸的是,它看起来似乎仍然没有得到修复。如果这些更改最终补充到上游主存储库中,那将是一件好事。”。
\1\033[36m:::\033[0m\1