Строка PS1 с текущей веткой и цветами Git

Вот моя нынешняя PS1:

export PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '

Как я могу отобразить текущую ветку другим цветом?


person cfischer    schedule 09.11.2010    source источник


Ответы (14)


Вы можете обернуть желаемую деталь в цвет следующим образом:

\e[0;32m - устанавливает цвет (в данном случае зеленый)

\e[m - восстанавливает цвет по умолчанию

Например, это устанавливает запрос на последний токен текущего пути, выделенный зеленым цветом, за которым следует $ цвета по умолчанию:

export PS1='\e[0;32m\w\e[m $'

Возможны и другие цвета. Чтобы получить полный список, прочтите эту статью под раскрашиванием. альтернатив.

person Simon Whitaker    schedule 09.11.2010
comment
Следует отметить, что лучше всего заключать цветовые коды между \[ и \], иначе у вас могут возникнуть проблемы с неправильным переносом длинной командной строки, потому что bash считает неправильное количество символов: askubuntu.com/questions/24358/ - person Kjir; 08.10.2013
comment
Это действительно хороший источник для раскраски приглашений bash. - person swhitmore; 03.10.2019
comment
Также я настоятельно рекомендую не жестко кодировать цветовые коды. Используйте $(tput setaf 2) (2 для зеленого, 1 для красного, 3 для желтого и т. Д.), $(tput bold) для жирного шрифта и $(tput sgr0) для сброса. См. mywiki.wooledge.org/BashFAQ/037. И используйте предложенные \[ и \] при назначении PS1: mywiki.wooledge.org/BashFAQ/053 - person MestreLion; 17.08.2020
comment
Как сказал @Kjir, чтобы избежать проблем с длинной командной строкой, которая не переносится правильно, наиболее правильным является: export PS1='\[\e[0;32m\]\w\[\e[0m\] $ ' - person MhagnumDw; 17.12.2020

Вот по частям (и без Ruby):

function color_my_prompt {
    local __user_and_host="\[\033[01;32m\]\u@\h"
    local __cur_location="\[\033[01;34m\]\w"
    local __git_branch_color="\[\033[31m\]"
    #local __git_branch="\`ruby -e \"print (%x{git branch 2> /dev/null}.grep(/^\*/).first || '').gsub(/^\* (.+)$/, '(\1) ')\"\`"
    local __git_branch='`git branch 2> /dev/null | grep -e ^* | sed -E  s/^\\\\\*\ \(.+\)$/\(\\\\\1\)\ /`'
    local __prompt_tail="\[\033[35m\]$"
    local __last_color="\[\033[00m\]"
    export PS1="$__user_and_host $__cur_location $__git_branch_color$__git_branch$__prompt_tail$__last_color "
}
color_my_prompt

Выглядит так (с моей собственной палитрой терминала):

Цветная подсказка

Также см. this и в этой статье.

person shaman.sir    schedule 22.05.2011
comment
Мне очень нравится, как вы все разделяете! Ваше здоровье - person Tiago; 10.12.2014
comment
@AhmedFasih - Я добавил к себе переменную грязного состояния: local __git_dirty='`git rev-parse 2>/dev/null && (git diff --no-ext-diff --quiet --exit-code 2> /dev/null || echo -e \*)`' - person Unglued; 29.05.2015

Вот моя линия PS1:

\n\[\e[1;37m\]|-- \[\e[1;32m\]\u\[\e[0;39m\]@\[\e[1;36m\]\h\[\e[0;39m\]:\[\e[1;33m\]\w\[\e[0;39m\]\[\e[1;35m\]$(__git_ps1 " (%s)")\[\e[0;39m\] \[\e[1;37m\]--|\[\e[0;39m\]\n$

alt text

person cmcginty    schedule 09.11.2010

function pc {
  [ -d .git ] && git name-rev --name-only @
}
PS1='\e];\s\a\n\e[33m\w \e[36m$(pc)\e[m\n$ '

ps1

Источник

person Steven Penny    schedule 04.05.2012
comment
Это показывает только ветку git в корневой папке репозитория git. - person anstue; 06.06.2019
comment
поскольку git worktrees - это вещь, которая приводит к тому, что .git является файлом, [ -r .git ] может быть улучшением для некоторых. - person danblack; 11.08.2020

Это мое решение для PS1.

Он отлично смотрится на Mac с темой Novel. Извините, но мой отступ немного изменился. Взламывайте, пока он вам не понравится.

function we_are_in_git_work_tree {
    git rev-parse --is-inside-work-tree &> /dev/null
}

function parse_git_branch {
    if we_are_in_git_work_tree
    then
    local BR=$(git rev-parse --symbolic-full-name --abbrev-ref HEAD 2> /dev/null)
    if [ "$BR" == HEAD ]
    then
        local NM=$(git name-rev --name-only HEAD 2> /dev/null)
        if [ "$NM" != undefined ]
        then echo -n "@$NM"
        else git rev-parse --short HEAD 2> /dev/null
        fi
    else
        echo -n $BR
       fi
    fi
}

function parse_git_status {
    if we_are_in_git_work_tree
    then
    local ST=$(git status --short 2> /dev/null)
    if [ -n "$ST" ]
    then echo -n " + "
    else echo -n " - "
    fi
    fi
}

function pwd_depth_limit_2 {
    if [ "$PWD" = "$HOME" ]
    then echo -n "~"
    else pwd | sed -e "s|.*/\(.*/.*\)|\1|"
    fi
}

COLBROWN="\[\033[1;33m\]"
COLRED="\[\033[1;31m\]"
COLCLEAR="\[\033[0m\]"

# Export all these for subshells
export -f parse_git_branch parse_git_status we_are_in_git_work_tree pwd_depth_limit_2
export PS1="$COLRED<$COLBROWN \$(pwd_depth_limit_2)$COLRED\$(parse_git_status)$COLBROWN\$(parse_git_branch) $COLRED>$COLCLEAR "
export TERM="xterm-color"

Если вас выписали в филиале, вы получите название филиала.

Если вы работаете в только что инициализированном проекте Git, вы просто получаете '@'.

Если у вас нет головы, вы получите красивое человеческое имя относительно некоторой ветки или тега с символом @ перед именем.

Если вы безголовый и не являетесь предком какой-либо ветки или тега, вы просто получаете короткий SHA1.

Кроме того, красный знак «-» означает чистый рабочий каталог и индекс, а красный знак «+» означает обратное.

person polypus74    schedule 15.08.2012
comment
Это хорошо, но для меня на Mac он не обновляется, когда я переключаю ветки. Возникли трудности с тем, чтобы отсрочить оценку. +1 для удобочитаемости. - person darKoram; 27.10.2013
comment
@darKoram: Вам, вероятно, нужно экранировать $ с помощью символа `\`. - person Gauthier; 03.02.2015
comment
Потрясающе, я взломаю его, но это было более или менее то, что я искал! +1 от меня :) - person Svetlin Tonchev; 04.01.2018
comment
В наши дни я бы просто рекомендовал Powerline. Есть (по крайней мере) версии python, go и rust. - person polypus74; 13.01.2019

Моя сверхмощная многострочная подсказка Linux!

Поместите его либо в свой .bashrc, либо лучше: сохраните его в / etc / bash-prompt и загрузите его из своего .bashrc.
Предполагается, что использование tput является правильным способом работы с цветами.

#!/bin/bash

set_prompt()
{
   local last_cmd=$?
   local txtreset='$(tput sgr0)'
   local txtbold='$(tput bold)'
   local txtblack='$(tput setaf 0)'
   local txtred='$(tput setaf 1)'
   local txtgreen='$(tput setaf 2)'
   local txtyellow='$(tput setaf 3)'
   local txtblue='$(tput setaf 4)'
   local txtpurple='$(tput setaf 5)'
   local txtcyan='$(tput setaf 6)'
   local txtwhite='$(tput setaf 7)'
   # unicode "✗"
   local fancyx='\342\234\227'
   # unicode "✓"
   local checkmark='\342\234\223'
   # Line 1: Full date + full time (24h)
   # Line 2: current path
   PS1="\[$txtbold\]\[$txtwhite\]\n\D{%A %d %B %Y %H:%M:%S}\n\[$txtgreen\]\w\n"
   # User color: red for root, yellow for others
   if [[ $EUID == 0 ]]; then
       PS1+="\[$txtred\]"
   else
       PS1+="\[$txtyellow\]"   
   fi
   # Line 3: user@host
   PS1+="\u\[$txtwhite\]@\h\n"
   # Line 4: a red "✗" or a green "✓" and the error number
   if [[ $last_cmd == 0 ]]; then
      PS1+="\[$txtgreen\]$checkmark \[$txtwhite\](0)"
   else
      PS1+="\[$txtred\]$fancyx \[$txtwhite\]($last_cmd)"
   fi
   # Line 4: green git branch
   PS1+="\[$txtgreen\]$(__git_ps1 ' (%s)')\[$txtwhite\]"
   # Line 4: good old prompt, $ for user, # for root
   PS1+=" \\$ "
}
PROMPT_COMMAND='set_prompt'
person cylgalad    schedule 21.06.2015
comment
Хороший, +1. Я все еще ищу тот, который отображал бы текущее имя пользователя. - person VonC; 21.06.2015
comment
Попробуйте добавить это где-нибудь в своем приглашении: $ (git config --global --get user.name) - person cylgalad; 21.06.2015
comment
Если вам нужен / current / user.name, зачем вам использовать конфигурацию --global? - person Gordon; 31.07.2015
comment
Не могли бы вы предоставить скриншот? - person mikezter; 14.05.2017
comment
@YuriGhensev: вам нужен исходный код git-prompt.sh. Для моего дистрибутива (Archlinux) его расположение: /usr/share/git/completion/git-prompt.sh, в других дистрибутивах это где-то еще (у него может даже быть другое имя файла), и вам, возможно, придется установить дополнительный пакет git. - person cylgalad; 29.11.2017
comment
Обратите внимание, что этот способ использования fancyx приведет к уничтожению многострочного приглашения (так же, как и при неправильном экранировании цветов unix.stackexchange.com/questions/105958/). Похоже, bash не очень хорошо понимает символы в целом. Таким простым решением будет заключить 2 из 3 частей этого широкого символа в \[\] - person The Godfather; 14.09.2018
comment
@VonC Взгляните на мой ответ выше, он включает имя пользователя. - person Dan L; 26.02.2019
comment
@DanL 4 года спустя (после моего первоначального комментария с запросом подсказки с user.name): хорошо сделано. Проголосовали. - person VonC; 26.02.2019
comment
@VonC Честно говоря, я опубликовал это около трех лет назад! ;) - person Dan L; 26.02.2019
comment
@DanL И ты все это время ждал, чтобы сказать мне? Извините, я пропустил это в то время! - person VonC; 26.02.2019

Для моего Mac с темой Homebrew это работает очень хорошо. Полностью отлаженный, очень быстрый и полностью автономный. БОНУС: достаточно умен, чтобы показывать ветку git ТОЛЬКО как часть приглашения, когда вы на самом деле в репозитории git! :)

# Color prompt for git
reset=$(tput sgr0)
boldgreen=$(tput setaf 2)$(tput bold)
cyan=$(tput sgr0)$(tput setaf 6)
boldred=$(tput setaf 1)$(tput bold)
boldwhite=$(tput setaf 7)$(tput bold)
boldyellow=$(tput setaf 3)$(tput bold)

PARENCLR=$'\001\e[0;36m\002'
BRANCHCLR=$'\001\e[1;33m\002'

alias branchname="git branch 2>/dev/null | sed -ne 's/^* \(.*\)/ ${PARENCLR}(${BRANCHCLR}\1${PARENCLR}\)/p'"

GIT_STATUS='$(branchname)'

PROMPT_CHAR="\$"
PS1="\[$boldgreen\]\u\[$cyan\]::\[$boldred\]\h \[$cyan\]{\[$boldwhite\].../\W\[$cyan\]}\[$reset\]$GIT_STATUS\[$reset\]$PROMPT_CHAR "

Вот как это выглядит: Mac + Homebrew + Color Git Prompt

Если вы хотите получить полный путь (или удалить ... /), просто измените -W на -w (и удалите ... /).

person Dan L    schedule 09.02.2016

Быстрый взлом:

  1. Добавляем это в ~/.bashrc:
parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

export PS1="\u@\h \[\e[32m\]\w \[\e[91m\]\$(parse_git_branch)\[\e[00m\]$ "
  1. Перезагрузите терминал или исходный код ~/.bashrc:

введите описание изображения здесь

Подробнее: https://medium.com/@thucnc/how-to-show-current-git-branch-with-colors-in-bash-prompt-380d05a24745

person thucnguyen    schedule 24.10.2019

Просто вызовите tput с соответствующими параметрами. См. Справочные страницы tput(1) и terminfo(5).

person Ignacio Vazquez-Abrams    schedule 09.11.2010
comment
Я думаю, что я неправильно избегаю вызова tput. Не могли бы вы привести пример? - person cfischer; 09.11.2010
comment
@Fernando: Обязательно заключите вашу tput команду в \[ и \], чтобы символы, которые она выводит, не учитывались в длине приглашения. Это предотвратит спутывание подсказки, например, при пролистывании истории. - person Dennis Williamson; 09.11.2010

Взгляните на liquidprompt:

https://github.com/nojhan/liquidprompt

Возможно, это слишком тяжело для ваших требований, но вы можете отключить функции, установив

LP_ENABLE_...=0

См. Документацию на странице выше.

person botkop    schedule 07.03.2014

Модифицированная версия приглашения @ cmcginty, которая добавляет функцию синтаксического анализа git и использует немного другой интервал:

# So I know where I am in repos:
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

# Modified from:
# https://stackoverflow.com/a/4138531/2662028
export PS1='\n\[\e[1;37m\]|-- \[\e[1;32m\]\u\[\e[0;39m\]@\[\e[1;36m\]\h\[\e[0;39m\]:\[\e[1;33m\]\w\[\e[0;39m\]\[\e[1;35m\]$(parse_git_branch " (%s)")\[\e[0;39m\] \[\e[1;37m\]--|\[\e[0;39m\]\n\$ '

Это также использует \$ в приглашении вместо $, что означает, что вы получите #, когда будете root.

person ryanpcmcquen    schedule 09.11.2018

Вот мой

export PS1="\n\[\033[1;30m\][$$:$PPID - \j:\!\[\033[1;30m\]]\[\033[0;36m\] \T \
\[\033[1;30m\][\[\033[1;34m\]\u@\H\[\033[1;30m\]:\[\033[0;37m\]${SSH_TTY:-o} \
\[\033[0;32m\]+${SHLVL}\[\033[1;30m\]] \[\033[1;37m\]\w\[\033[0;37m\]\[\033[1;34m\]\$(__git_ps1 \" (%s)\") \[\033[0;37m\] \n\$ "
person Tony Lâmpada    schedule 20.03.2014
comment
вы можете объяснить компоненты? - person Validus Oculus; 07.10.2017

Вот решение для Windows / Cygwin / Bash.

Добавьте следующее в свой ~/.bashrc файл.

xxx - это местоположение вашего локального репозитория Git.

GetBranch()
{
    cat /cygdrive/c/xxx/.git/HEAD | sed 's+^ref: refs/heads/++'
}
export PS1="\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[36m\]\$(GetBranch) \[\e[33m\]\w \[\e[0m\] \n\$ "
person Ellis    schedule 31.01.2014
comment
-1 для жестко заданного пути к репозиторию. Это будет работать только для одного репозитория, поэтому его использование только теоретически. - person David Ferenczy Rogožan; 30.04.2014

Для более сложного статуса Git вы можете использовать более крупный скрипт.

person mpapis    schedule 14.11.2010