Чтобы получить подсказку с указанием Git-ветки в Zsh - PullRequest
50 голосов
/ 15 июля 2009

Я запускаю следующие коды отдельно, так как моя подсказка неудачно в .zshrc. Это наводит меня на мысль, что, очевидно, у меня нет программы с именем __git_ps1. Это не в MacPorts.

# 1

PROMPT="$(__git_ps1 " \[\033[1;32m\] (%s)\[\033[0m\]")\$"$

# 2

PROMPT="$(__git_ps1 " (%s)")\$"$

# 3

# Get the name of the branch we are on
git_prompt_info() {
  branch_prompt=$(__git_ps1)
  if [ -n "$branch_prompt" ]; then
    status_icon=$(git_status)
    echo $branch_prompt $status_icon
  fi
}

# Show character if changes are pending
git_status() {
  if current_git_status=$(git status | grep 'added to commit' 2> /dev/null); then
    echo "☠"
  fi
}
autoload -U colors
colors
setopt prompt_subst
PROMPT='
%~%{$fg_bold[black]%}$(git_prompt_info)
→ %{$reset_color%}'

Как вы можете получить подсказку, которая показывает название Git-ветви?

Ответы [ 6 ]

63 голосов
/ 15 июля 2009

__git_ps1 из git-creation.bash. В zsh вы, вероятно, должны предоставить свою собственную функцию для определения текущей директории git branch. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1004

Вам просто нужно:

  • функция для предоставления имени ветви
  • включить подстановку подсказки (команды)
  • добавьте функцию к вашему приглашению

Например

git_prompt() {
 ref=$(git symbolic-ref HEAD | cut -d'/' -f3)
 echo $ref
}
setopt prompt_subst
PS1=$(git_prompt)%#
autoload -U promptinit
promptinit

Обновление: используйте модуль zsh vcs_info вместо git_prompt ()

setopt prompt_subst
autoload -Uz vcs_info
zstyle ':vcs_info:*' actionformats \
    '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
zstyle ':vcs_info:*' formats       \
    '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{5}]%f '
zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat '%b%F{1}:%F{3}%r'

zstyle ':vcs_info:*' enable git cvs svn

# or use pre_cmd, see man zshcontrib
vcs_info_wrapper() {
  vcs_info
  if [ -n "$vcs_info_msg_0_" ]; then
    echo "%{$fg[grey]%}${vcs_info_msg_0_}%{$reset_color%}$del"
  fi
}
RPROMPT=$'$(vcs_info_wrapper)'
32 голосов
/ 25 мая 2010

Вот расширенное приглашение git для zsh: zsh-git-prompt .

alt text

23 голосов
/ 17 октября 2012

ko-dos ответит отлично, но я предпочитаю немного более осведомленную о git подсказку, чем ту, которую он использует. В частности, мне нравятся помеченные, неотмеченные и неотслеживаемые уведомления о файлах в самой подсказке. Используя его ответ и примеры zsh vcs_info, я придумал следующее:

setopt prompt_subst
autoload -Uz vcs_info
zstyle ':vcs_info:*' stagedstr 'M' 
zstyle ':vcs_info:*' unstagedstr 'M' 
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:*' actionformats '%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
zstyle ':vcs_info:*' formats \
  '%F{5}[%F{2}%b%F{5}] %F{2}%c%F{3}%u%f'
zstyle ':vcs_info:git*+set-message:*' hooks git-untracked
zstyle ':vcs_info:*' enable git 
+vi-git-untracked() {
  if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \
  [[ $(git ls-files --other --directory --exclude-standard | sed q | wc -l | tr -d ' ') == 1 ]] ; then
  hook_com[unstaged]+='%F{1}??%f'
fi
}


precmd () { vcs_info }
PROMPT='%F{5}[%F{2}%n%F{5}] %F{3}%3~ ${vcs_info_msg_0_} %f%# '

Это создает приглашение, имитирующее раскрашенный вывод git status -s (который можно настроить в файле .gitconfig). Картина, пожалуй, самая полезная здесь:

prompt

По сравнению с git status -s:

enter image description here

Если вам не нравится цветной вывод или вы предпочитаете какой-либо другой символ или конструкцию приглашения, просто измените значения stagedstr, unstagedstr и hook_com[unstaged] в приведенном выше коде.

0 голосов
/ 17 мая 2019

Многие из этих решений показались мне медленными, когда я нажимал клавишу возврата, поэтому вот базовый и быстрый вариант:

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

setopt PROMPT_SUBST
PROMPT='%9c%{%F{green}%}$(parse_git_branch)%{%F{none}%} $ '

Вы получите приглашение, которое выглядит следующим образом: ~/dev/project (feature-branch) $

0 голосов
/ 27 октября 2018

Я только что переделал мой, так как у нас на работе длинные имена веток. Этот будет усечен с помощью многоточия, если его длина превышает 35 символов.

parse_git_branch() {
    git_status="$(git status 2> /dev/null)"
    pattern="On branch ([^[:space:]]*)"
    if [[ ! ${git_status} =~ "(working (tree|directory) clean)" ]]; then
        state="*"
    fi
    if [[ ${git_status} =~ ${pattern} ]]; then
      branch=${match[1]}
      branch_cut=${branch:0:35}
      if (( ${#branch} > ${#branch_cut} )); then
          echo "(${branch_cut}…${state})"
      else
          echo "(${branch}${state})"
      fi
    fi
}

setopt PROMPT_SUBST
PROMPT='%{%F{blue}%}%9c%{%F{none}%}$(parse_git_branch)$'

(Я смущен тем, как я горжусь этим.)

0 голосов
/ 15 июля 2009

Спасибо за ссылки!

Я сделал следующее приглашение на их основе

     # get the name of the branch we are on
     git_prompt_info() { 
         git branch | awk '/^\*/ { print $2 }'
     }
     get_git_dirty() { 
       git diff --quiet || echo '*'
     }

     autoload -U colors
     colors     
     setopt prompt_subst

     PROMPT='%{$fg[blue]%}%c %{$fg_bold[red]%}$(git_prompt_info)$(get_git_dirty)%{$fg[blue]%} $ %{$reset_color%}'                                           

     RPROMPT='%{$fg[green]%}%1(j.%j.)'        

Пожалуйста, предложите какие-либо улучшения.

...