web-dev-qa-db-fra.com

Pour obtenir une invite indiquant Git-branch dans Zsh

J'exécute les codes suivants séparément en tant qu'invite sans succès dans .zshrc. Cela me suggère qu'apparemment, je n'ai pas de programme appelé __git_ps1. Ce n'est pas dans 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%}'

Comment pouvez-vous obtenir une invite indiquant le nom d'une branche Git?

__git_ps1 provient de git-completion.bash. Dans zsh, vous devez probablement fournir votre propre fonction pour déterminer la branche git des répertoires actuels. Il y a pas mal de messages sur le blog sur un invite de git pour zsh.

Vous avez juste besoin:

  • une fonction pour fournir le nom de la branche
  • activer la substitution d'invite (commande)
  • ajouter la fonction à votre invite

Par exemple

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

Update: utilise le module zsh vcs_info à la place de 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)'
63
ko-dos

Voici une invite git étendue pour zsh: zsh-git-Prompt .

alt text

32
Olivier Verdier

la réponse de ko-dos est excellente, mais je préfère une invite légèrement plus avertie que celle qu'il utilise. En particulier, j'aime les notifications de fichiers mises en scène, non mises en scène et non suivies dans l'invite même. En utilisant sa réponse et les exemples zsh vcs_info, je suis arrivé avec ce qui suit:

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%# '

Cela crée une invite qui imite la sortie colorisée de git status -s (qui peut être configurée dans votre fichier .gitconfig). Une image est peut-être plus utile ici:

Prompt

Comparé à git status -s:

enter image description here

Si vous n'aimez pas les sorties colorisées, ou si vous préférez un autre caractère ou une construction Prompt, modifiez simplement les valeurs stagedstr, unstagedstr et hook_com[unstaged] dans le code ci-dessus.

23
Christopher

Merci pour les liens!

J'ai fait l'invite suivante basée sur eux

     # 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.)'        

S'il vous plaît, suggérer des améliorations.

Je viens de refaire le mien car nous avons de longs noms de branches au travail. Celui-ci sera tronqué avec un Ellipsis s'il comporte plus de 35 caractères.

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)$'

(Je suis gêné de voir à quel point je suis fier de cela.)

0
Dan Rosenstark

Beaucoup de ces solutions me paraissaient lentes lors de l'écrasement de la clé de retour. Voici donc une option simple et rapide:

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}%} $ '

Vous obtiendrez une invite qui ressemblera à ceci: ~/dev/project (feature-branch) $

0
Phil