如何给editline应用程序的提示信息添加颜色

6

我正在尝试给一款由libedit驱动的应用程序着色,但是颜色似乎没有显示出来。您有什么想法,我在这里做错了什么吗?

#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;
}

编译使用

clang++ editline.cc -ledit && ./a.out

并且很不幸,它只显示了未着色的提示符:
:::     
3个回答

3
Editline不支持彩色提示符。有一个实现它们的补丁
有趣的是,在屏幕更新期间,editline先在内存缓冲区中呈现图像,然后将其与上一帧进行差异比较,并发出命令以修复差异。这些命令包括moveto(x,y),delete(n)和insert(text)。
这种设计使代码更简单。例如,编辑器中的插入命令可以并实际上重新绘制整个屏幕,但是终端绘制命令的结果序列是最小的。
不幸的是,由于文本在到达终端之前经历了复杂的转换,因此某些信息会丢失,比如颜色。

如果这些更改最终能够被合并到上游主存储库中,那将是非常好的。 - mavam

2

\1被用作起始/结束的字面字符,因此这似乎是正确的行为。

\1\033[36m\1:::\1\033[0m\1
|          |   |         |
|          |   |_Start   |_Stop
|          |
|_Start    |_Stop

EL_PROMPT_ESC,char *(*f)(EditLine *),char c 与EL_PROMPT相同,但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 中正常的终止符。


有趣的是,\1\[\033[36m\]\1:::\1\[\033[0m\]\1 给了我一个带内部 ][ 着色的提示符号 [][]:::。看起来 \1 终止了着色。确实,使用 "\1\033[36m:::\033[0m\1 ",没有中间的转义字符,可以产生带颜色的提示符! - mavam
当我使用彩色提示符时,退格键不再起作用了,它只是向TTY打印转义字符。这里可能有什么问题? - mavam
3
我认为这整个问题是libedit中的一个错误。我已经联系了Christos Zoulas。如果我得到回复,我会在这里发布。 - Chewi
@Chewi:感谢您联系作者,如果这个问题得到解决,我会非常高兴! - mavam
@Chewi:我也有同样的问题,尽管我的设置更加复杂。我也对结果很感兴趣。 - Stefano Borini
2
抱歉,我最终确实收到了回复,但完全忘记了这件事。 "这是一个已知的错误(针对颜色提示)。它需要一些严肃的工作来修复,因为现在提示函数没有办法在正确的时间处理打印属性。我会研究一下。"不幸的是,看起来它仍然没有被修复。 - Chewi

1
" 'esc[0m' 重置了所有属性,因此显示的颜色将立即消失,最好将属性设置为不同的颜色,例如白色 'esc[47m'。请参见http://www.termsys.demon.co.uk/vtansi.htm以获取更全面的属性列表。"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接