2014-01-20 3 views
6

Я пытаюсь раскрасить приглашение приложения на питание от libedit, но я просто не вижу цвета. Любые идеи, что я делаю неправильно здесь?Как раскрасить приглашение приложения 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_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 

и показывает, к сожалению, только неокрашенную подсказку:

:::  

ответ

2

\ 1 используются в качестве остановки/запуск буквального характера, так что, кажется, быть правильным поведением.

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

EL_PROMPT_ESC, символ * (* е) (EditLine *), символ с То же, что EL_PROMPT, но с аргументом указывает START/STOP буквального быстрое характер.

 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, возможно прекращение цвета от использования, в то время как \[ ... \] бы нормальные терминаторы в Баше.

+0

Интересно, что '\ 1 \ [\ 033 [36m \] \ 1 ::: \ 1 \ [\ 033 [0m \] \ 1' дал мне приглашение' [] [] ::: 'с внутренней '] [' раскрашивается. Казалось, что '\ 1' завершает окраску. Действительно, использование '' \ 1 \ 033 [36m ::: \ 033 [0m \ 1 "', без escape-символов в середине, дает цветное приглашение! – mavam

+0

Когда я использую цветное приглашение, ключ backspace больше не работает, он печатает только экранированные символы в TTY. Любые идеи, что может быть проблемой здесь? – mavam

+3

Я считаю, что вся эта проблема является ошибкой в ​​libedit. Я связался с Кристосом Зуласом. Я отправлю сообщение, если я получу ответ. – Chewi

1

«ESC [0m» сбрасывает все атрибуты, поэтому отображается цвет сразу пропадают, лучше установить атрибут другого цвета, например белый «ESC [47м»

см http://www.termsys.demon.co.uk/vtansi.htm для более полный список атрибутов

3

Редактировать строку не поддерживает цветовые подсказки. Существует patch их реализации.

Интересно, что во время обновления экрана editline визуализирует изображение сначала в буфере памяти, отличается от предыдущего кадра и затем испускает команды для исправления разницы. Команды: moveto(x,y), delete(n), insert(text).

Эта конструкция позволяет использовать более простой код. Например, команда insert в редакторе может и на самом деле перерисовывать весь экран, но результирующая последовательность команд рисования терминала минимальна.

К сожалению, поскольку до перехода на терминал текст претерпевает сложные преобразования, некоторая информация теряется в переводе, например, в цвет.

+0

Было бы здорово, если бы эти изменения внесли его в главный репозиторий вверх по течению. – mavam

Смежные вопросы