Para obter um aviso que indica Git-filial em Zsh
Pergunta
Eu corro os seguintes códigos separadamente como meu prompt de sem sucesso em .zshrc. Isto sugere-me que, aparentemente, eu não tenho um programa chamado __git_ps1. Não é em 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%}'
Como você pode obter um prompt que mostra o nome de um Git-branch?
Solução
__git_ps1
é de git-completion.bash. Em zsh você provavelmente terá que fornecer sua própria função para determinar os diretórios atuais git branch. Há muito poucos posts sobre um prompt de git para zsh.
Você só precisa:
- uma função para fornecer o nome do ramo
- ativar o prompt (comando) substituição
- adicionar a função para o prompt
Por exemplo
git_prompt() {
ref=$(git symbolic-ref HEAD | cut -d'/' -f3)
echo $ref
}
setopt prompt_subst
PS1=$(git_prompt)%#
autoload -U promptinit
promptinit
Update: usar o zsh vcs_info módulo em vez 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)'
Outras dicas
Aqui está um git estendida pronta para zsh:. -zsh-git prompt de
resposta KO-DOS é grande, mas eu prefiro um prompt de consciência um pouco mais git do que aquela que ele usa. Especificamente, eu gosto de encenado, unstaged, e notificações de arquivos untracked no prompt de si. Usando sua resposta e os exemplos zsh vcs_info, Vim -se com o seguinte:
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%# '
Isso cria uma linha que imita a saída colorida de git status -s
(que pode ser configurado em seu arquivo .gitconfig
). A imagem é talvez mais útil aqui:
Em comparação com git status -s
:
Se você não gosta de saída colorida, ou prefere algum outro caractere ou construção pronta, basta alterar as stagedstr
, unstagedstr
e valores hook_com[unstaged]
no código acima.
Muitas dessas soluções pareceu lento para mim quando esmagou a tecla de retorno, então aqui está uma opção que é básico e rápida:
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}%} $ '
Você receberá um prompt que se parece com isso:
~/dev/project (feature-branch) $
Obrigado pelos links!
Eu fiz a seguinte solicitação com base neles
# 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.)'
Por favor, sugerir quaisquer melhorias.
Eu só refez meu desde temos nomes Long Branch no trabalho. Este vai truncar com reticências se é mais de 35 caracteres.
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)$'
(Eu estou envergonhado pelo que estou muito orgulhoso disso.)