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