Я пытаюсь раскрасить подсказку приложения, работающего на 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
и показывает, к сожалению, только неокрашенное приглашение:
:::
\ 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.
Страница man утверждает, используя 0
сбросить цвет, но немного неясно, что они имеют в виду.
Может быть, попробовать последовательность escape, как это:
\1\033[36m:::\033[0m\1
Так как \1
возможно прекращает использование цвета, тогда как \[ ... \]
были бы обычные терминаторы в Bash.
Editline не поддерживает цветные подсказки. Eсть пластырь реализуя их.
Интересно, что во время обновления экрана editline отображает изображение сначала в буфере памяти, сравнивает с предыдущим кадром, а затем выдает команды, чтобы исправить разницу. Команды moveto(x,y)
, delete(n)
, insert(text)
,
Эта конструкция позволяет более простой код. Например, команда вставки в редакторе может и фактически перерисовывает весь экран, но результирующая последовательность команд отрисовки терминала минимальна.
К сожалению, так как текст подвергается сложным преобразованиям до достижения терминала, некоторая информация теряется при переводе, например цвет.
«esc [0m» сбрасывает ВСЕ атрибуты, поэтому отображаемый цвет сразу исчезает, лучше установить для атрибута другой цвет. Например, белый «esc [47m»)
увидеть http://www.termsys.demon.co.uk/vtansi.htm
для более полного списка атрибутов