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.
Prompt="$(__git_ps1 " \[\033[1;32m\] (%s)\[\033[0m\]")\$"$
Prompt="$(__git_ps1 " (%s)")\$"$
# 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:
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)'
Voici une invite git étendue pour zsh: zsh-git-Prompt .
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:
Comparé à git status -s
:
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.
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.)
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) $