【问题标题】:How to colorize the prompt of an editline application如何为编辑行应用程序的提示着色
【发布时间】:2014-02-09 23:42:11
【问题描述】:

我正在尝试为由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

不幸的是,仅显示以下无色提示:

:::     

【问题讨论】:

    标签: c++ c colors prompt editline


    【解决方案1】:

    \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 ",中间没有转义字符,会产生彩色提示!
    • 当我使用彩色提示时,退格键不再起作用,它只是将转义字符打印到 TTY。有什么想法可能是这里的问题吗?
    • 我相信这整个问题是 libedit 中的一个错误。我已经就此事联系了 Christos Zoulas。如果我得到答案,我会在这里发帖。
    • @Chewi:感谢您与作者联系,如果这个问题得到解决,我会很高兴!
    • 对不起,我最终确实得到了回复,但忘记了这一切。 “这是一个已知的错误(对于颜色提示)。它需要一些认真的工作才能修复,因为现在提示功能无法在正确的时间处理打印属性。我会调查它。”不幸的是,它看起来好像还没有修复。
    【解决方案2】:

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

    http://www.termsys.demon.co.uk/vtansi.htm 获取更全面的属性列表

    【讨论】:

      【解决方案3】:

      Editline 不支持颜色提示。有一个 patch 实现它们。

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

      这种设计允许更简单的代码。例如,编辑器中的插入命令可以而且确实会重绘整个屏幕,但最终的终端绘图命令序列很少。

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

      【讨论】:

      • 如果这些更改最终能融入上游主存储库,那就太好了。
      猜你喜欢
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多