2016-09-03 2 views
2

Это для меня время для бас-вокалиста (должно было произойти в один прекрасный день ...).Запросить изображение Bash с цветом фона, заканчивающимся до конца строки

Я пытаюсь получить 2-строка, а:

  • первая линия с информацией о местоположении, и цвет фона до конца строки
  • второй линии со временем и кодом выхода предыдущей команды

Я почти там, но я не могу взломать часть «цвет фона до конца строки». Не совсем.

Сборка бит информации из нескольких источников и, самое главное, от here и here, я получаю this result (terminal screenshot).

Как вы можете видеть, что-то не так с расчетами столбцами:

  • он не доходит до конца строки
  • зависит от длины текста на 1-й линии
  • становится хуже, когда достигая нижней части терминала; он доходит до конца строки; неправильная линия ...
  • еще одна странная вещь: крошечные [], которые брекетируют вторую строку подсказки; и те, ТОЛЬКО ПОЯВИТСЯ ПОСЛЕ КОМАНДЫ ВВЕДЕН

Это мой Bashrc код:

PROMPT_COMMAND=__prompt_command 
__prompt_command() 
{ 
    local EXIT="$?" 

    local Red='\[\033[1;38;5;9m\]' 
    local Green='\[\033[1;38;5;10m\]' 
    local Gray='\[\033[0;38;5;248m\]' 
    local BgBlue='\[\033[48;5;253;1;38;5;12m\]' 
    local BgPurple='\[\033[48;5;253;1;38;5;93m\]' 
    local None='\[\e[0m\]' 

    PS1="${BgPurple}\[email protected]\h:${BgBlue}\$PWD" 

    printf -v TC_SPC "%${COLUMNS}s" '' 

    COLUMNS=$(tput cols) 
    PS1=`echo $PS1 | sed "s/$/$TC_SPC/; s/^\\(.\\{${COLUMNS}\\}\\) */\\1/"` 

    PS1+="\n${Gray}\D{%F %T}" 

    if [ $EXIT != 0 ]; then 
     PS1+=" ${Red} O_o ${None}"  # Add red if exit code non 0 
    else 
     PS1+="${Green} ^_^ ${None}" 
    fi 
} 

Я попытался еще не взлом, но никакого успеха.

О, есть еще одна более сложная версия SED бит, который я также пытался:

PS1=`echo $PS1 | sed "s/$/$TC_SPC/; s/^\\(\\(\\o33\\[[0-9;]*[a-zA-Z]\\)*\\)\\([^\o033]\\{${COLUMNS}\\}\\) */\\1\\3/"` 

Different result (terminal screenshot), но все еще не в порядке.

На данный момент я принимаю любую помощь!

ответ

0

Вместо:

printf -v TC_SPC "%${COLUMNS}s" '' 

COLUMNS=$(tput cols) 
PS1=`echo $PS1 | sed "s/$/$TC_SPC/; s/^\\(.\\{${COLUMNS}\\}\\) */\\1/"` 

Использование:

PS1+=$'\033[K' #erase to end of line 
+0

Спасибо Эрик, работает идеально и так просто ... Мне пришлось добавить это после обеих строк, вторая нужна для устранения проблемы при достижении нижней части терминала. Из любопытства, что означает «$», предусмотренное в вашем предложении? Я пытался с ним и без него, и, похоже, он достиг того же. – Peyo61

+0

В bash '$ 'STRING'' похожа на строку с одной кавычкой, но придает особое значение последовательностям с обратным слэшем. В этом случае '\ nnn' заменяется на« восьмибитовый символ, значение которого составляет восьмеричное значение nnn (от одной до трех цифр) ». Октал 033 является символом эвакуации.См. 'Man bash' и найдите' $ ''для полного списка. – Eric

0

Вот рабочий раствор, благодаря Эрик "стереть до конца строки" намек.

PROMPT_COMMAND=__prompt_command # Func to gen PS1 after CMDs 
__prompt_command() 
{ 
    local EXIT="$?"    # This needs to be first (retrieves last commmand exit code) 

    local Red='\[\033[1;38;5;9m\]' 
    local Green='\[\033[1;38;5;10m\]' 
    local Gray='\[\033[0;38;5;248m\]' 
    local BgBlue='\[\033[48;5;253;1;38;5;12m\]' 
    local BgPurple='\[\033[48;5;253;1;38;5;93m\]' 
    local None='\[\e[0m\]' 

    PS1="${BgPurple}\[email protected]\h:${BgBlue}\$PWD" 
    PS1+="\033[K"    # erase to end of 1st line (background color stays) 

    PS1+="\n${Gray}\D{%F %T}\a" 

    if [ $EXIT != 0 ]; then 
    PS1+="${Red} O_o ${None}" # Add red if exit code non 0 
    else 
    PS1+="${Green} ^_^ ${None}" 
    fi 
    PS1+="\033[K"    # erase to end of 2nd line (no more background color) 
} 

И here is the result (terminal screenshot). Еще один счастливый приглашенный владелец ...

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