获取指示Zsh中Git分支的提示

获取指示Zsh中Git分支的提示,git,zsh,prompt,Git,Zsh,Prompt,我在.zshrc中单独运行以下代码作为提示失败。这表明我显然没有一个名为uu git_ps1的程序。它不在MacPorts #1 #2 如何获得显示Git分支名称的提示?\uu Git\u ps1来自Git-completion.bash。在zsh中,您可能需要提供自己的函数来确定git分支的当前目录。对于zsh,有很多关于a的问题 你只需要: 提供分支名称的函数 启用提示(命令)替换 将函数添加到提示中 比如说 git_prompt() { ref=$(git symbolic-ref

我在.zshrc中单独运行以下代码作为提示失败。这表明我显然没有一个名为uu git_ps1的程序。它不在MacPorts

#1 #2
如何获得显示Git分支名称的提示?
\uu Git\u ps1
来自Git-completion.bash。在zsh中,您可能需要提供自己的函数来确定git分支的当前目录。对于zsh,有很多关于a的问题

你只需要:

  • 提供分支名称的函数
  • 启用提示(命令)替换
  • 将函数添加到提示中
比如说

git_prompt() {
 ref=$(git symbolic-ref HEAD | cut -d'/' -f3)
 echo $ref
}
setopt prompt_subst
PS1=$(git_prompt)%#
autoload -U promptinit
promptinit
更新:使用zsh vcs\u信息模块代替git\u提示符()


谢谢你的链接

我根据它们做出了以下提示

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

请提出任何改进意见。

这里是zsh的扩展git提示符:


ko dos的答案很好,但我更喜欢git意识略强于他使用的提示。具体来说,我喜欢提示符本身中的分段、未分段和未跟踪文件通知。根据他的回答和答案,我得出以下结论:

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
文件中配置)。在这里,图片可能是最有用的:

与git状态-s相比:


如果您不喜欢彩色输出,或者希望使用其他字符或提示结构,只需更改上述代码中的
stagedstr
unstagedstr
hook\u com[unstaged]
值即可。

我刚刚重新输入了我的,因为我们有很长的分支名称在工作。如果超过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)$'

(我对此感到很尴尬。)

对我来说,在捣碎返回键时,这些解决方案中的很多似乎都很慢,因此这里有一个基本且快速的选项:

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(featurebranch)$

对于任何对维护的现成解决方案感兴趣的人,请安装-默认情况下,它有一个git插件。我一直在寻找类似的东西-无需思考的预先创建的配置,效果很好。

如果您的所有提示看起来都很好,但不起作用,例如:

function git_branch(){                                                                                                                 
    ref=$(git symbolic-ref --short --quiet HEAD 2>/dev/null)        
    if [ -n "${ref}" ]; then                                                    
        echo "(""$ref"")"                                                       
    fi                                                                          
}                                                                               
                                                                                
setopt PROMPT_SUBST                                                             

PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m:%{$fg[yellow]%}%1~%{$reset_color%} %{%F{green}%}$(git_branch)%{%F{none}%}$ "
提示必须设置为使用单引号而不是双引号引用的字符串

PROMPT='%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m:%{$fg[yellow]%}%1~%{$reset_color%} %{%F{green}%}$(git_branch)%{%F{none}%}$ '

这已经有了很多很好的答案,对于那些不想使用更多的
zsh
config和
git
的读者来说,这似乎是一个权威性的问题

然而,我发现自己只是想要

工作目录(git分支颜色,如果未提交)%24小时时间戳
git\u分支\u测试\u颜色(){
本地引用=$(git符号引用--短头2>/dev/null)
如果[-n“${ref}”];则
如果[-n“$(git状态--瓷器)”;则
本地gitstatuscolor='%F{red}'
其他的
本地gitstatuscolor='%F{green}'
fi
回显“${gitstatuscolor}(${ref})”
其他的
回声“”
fi
}
setopt提示符_SUBST
提示符=“%9c$(git_分支_测试_颜色)%F{none}%#”
#在右侧添加24小时时间
RPROMPT='%D{%k:%M:%S}

这是由

  • 通过设置
    PROMPT\u SUBST
    ,允许包含函数(
    $()
    )(感谢)
  • 声明一个函数
    git\u branch\u test\u color
    来调用分支引用的
    git
    。如果当前目录是git存储库,则通过该函数是否成功(测试stdout)来执行
    (感谢对
    symbolic ref
    arg!的一些注释)
    • 如果不是git回购,则只回显空字符串
  • 如果初始调用成功(确实收集了stdout),则当前目录为git目录,并且
    git状态--
    用于确定是否有任何文件已更改或是新的/删除的
    • 未更改的绿色着色前缀
    • 更改的红色着色前缀(无论是什么)


请注意,所有此类提示在装入的目录上都可能很慢(尤其是通过
sshfs
)。如果遇到这种情况,我建议尽可能对这些目录进行特殊的装箱(可能创建一个新的shell函数来检查cd是否在您的集合中),或者总是装载在相同的路径中并忽略它()

不要使用git branch。它是瓷器,用于UI,而不是脚本。使用git symbolic ref和BR=${BR#refs/heads/}@Jakub:谢谢你指出这一点我刚刚注意到git分支会导致非git目录出现bug。@Jakub Narębski:你也可以做
git symbolic ref--short HEAD
,这将为你删除“refs/heads/”业务。喜欢它!完美的非常好的工作,现在在我自己的dotfiles repo中有一个子模块:)您的方法与vcs_信息相比如何?你的剧本似乎在重新发明轮子?(但并没有阻止我使用它,我不知道vcs_信息)在寻源过程中遇到问题:“未识别的修饰符'A'”。zsh 4.2.6(x86_64-redhat-linux-gnu)。这是一个已知的问题吗?存储库不再维护-似乎有些人接管了这里:编辑链接到它的答案无法使它运行,我上面提到的回购协议也不能。如果发现ohmyzsh做得很好,请参阅git_提示符是错误的,如果您有一个带有/它不工作的分支。改用
cut-d'/'-f3-
。谢谢!,这很有效。你能解释一下那些神秘的zstyle命令是做什么的吗?@balki The
%F{n}
为前景启用
n
,而
%F
禁用前景颜色。例如,
格式
格式%F{5}(%F%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}]%F如果忽略颜色,则变成
(%s)-[%b]
%s
被vc系统(例如git)替换,
%b
被当前分支替换。@balki
上的
(sv[nk]| bzr)
子模式
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)$'
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}%} $ '
function git_branch(){                                                                                                                 
    ref=$(git symbolic-ref --short --quiet HEAD 2>/dev/null)        
    if [ -n "${ref}" ]; then                                                    
        echo "(""$ref"")"                                                       
    fi                                                                          
}                                                                               
                                                                                
setopt PROMPT_SUBST                                                             

PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m:%{$fg[yellow]%}%1~%{$reset_color%} %{%F{green}%}$(git_branch)%{%F{none}%}$ "
PROMPT='%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m:%{$fg[yellow]%}%1~%{$reset_color%} %{%F{green}%}$(git_branch)%{%F{none}%}$ '