可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I run the following codes separately as my prompt unsuccessfully in .zshrc. This suggests me that apparently I do not have a program called __git_ps1. It is not in MacPorts.
#1
PROMPT="$(__git_ps1 " \[\033[1;32m\] (%s)\[\033[0m\]")\$"$
#2
PROMPT="$(__git_ps1 " (%s)")\$"$
How can you get a prompt which shows the name of a Git-branch?
回答1:
__git_ps1
is from git-completion.bash. In zsh you probably have to provide your own function to determine the current directories git branch. There are quite a few blog posts about a git prompt for zsh.
You just need:
- a function to provide the branch name
- enable prompt (command) substitution
- add the function to your prompt
For example
git_prompt() { ref=$(git symbolic-ref HEAD | cut -d'/' -f3) echo $ref } setopt prompt_subst PS1=$(git_prompt)%# autoload -U promptinit promptinit
Update: use the zsh vcs_info module instead of 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)'
回答2:
Here is an extended git prompt for zsh: zsh-git-prompt.
回答3:
ko-dos's answer is great, but I prefer a slightly more git aware prompt than the one he uses. Specifically, I like staged, unstaged, and untracked file notifications in the prompt itself. Using his answer and the zsh vcs_info examples, I came up with the following:
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%# '
This creates a prompt that mimics the colorized output of git status -s
(which can be configured in your .gitconfig
file). A picture is perhaps most helpful here:
Compared with git status -s
:
If you don't like colorized output, or would prefer some other character or prompt construction, just change the stagedstr
, unstagedstr
, and hook_com[unstaged]
values in the above code.
回答4:
Thank you for the links!
I made the following prompt based on them
# 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.)'
Please, suggest any improvements.