#git-status #gist #git #status #pretty-print #dsl #git-repository

已删除 gist-i

用于美化打印git统计信息的实用工具

使用旧的Rust 2015

0.1.0 2018年2月5日

#10 in #gist

MPL-2.0 许可证

63KB
1K SLoC

Gist

一种用于以自定义格式打印git统计信息的领域特定语言。

安装

快速入门

只要您已经设置了rust工具链,安装就像这样简单

$ cargo install gist-i

您可以在 rustup.rs 下载rust工具链。

gist-i的基本用法是

$ gist-i <FORMAT>

了解更多信息和获取帮助

$ gist-i help

如果您在bash shell中,要将gist格式添加到您的shell提示符中,请将以下片段添加到您的 ~/.bashrc

__is_git_repo() {
    # return 128 if not in git repository, return 0 if in repo
    git status -sb --porcelain &>/dev/null
    echo "$?"
}

__set_prompt() {
    local EXIT="$?"
    # Capture last command exit flag first

    # Your gist format
    local fmt="\<#m;*(\b)#m(\B(#~('..')))\(#g(\+)#r(\-))>\[#g;*(\M\A\R\D)#r;*(\m\a\u\d)]\{#m;*;_(\h('@'))}"

    # If color support exists, set color values, otherwise set them as empty
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
      # We have color support; assume it's compliant with Ecma-48
      # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
      # a case would tend to support setf rather than setaf.)
      local nc="\[\033[0m\]"
      local red="\[\033[00;31m\]"
      local grn="\[\033[00;32m\]"
      local ylw="\[\033[00;33m\]"
      local blu="\[\033[00;34m\]"
      local bgrn="\[\033[01;32m\]"
      local bylw="\[\033[01;33m\]"
      local bblu="\[\033[01;34m\]"
      local bpur="\[\033[01;35m\]"
    fi

    # Clear out prompt
    PS1=""

    # If the last command didn't exit 0, display the exit code
    [ "$EXIT" -ne "0" ] && PS1+="$red$EXIT$nc "

    # identify debian chroot, if one exists
    if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
      PS1+="${debian_chroot:+($(cat /etc/debian_chroot))}"
    fi

    if [ "$(__is_git_repo)" -eq "0" ]; then
      local stats="$(gist-i $fmt)"
      PS1+="$stats:$bylw\w$nc\n\$ "
    else
      PS1+="$bgrn\u$grn@\h$nc:$bblu\w$nc\$ "
    fi
}

export PROMPT_COMMAND=__set_prompt

其中变量 fmt 包含您的gist格式。以下是一些您可能想在自己的系统上尝试的示例。

示例 fmt 结果
"\<#m;*(\b)#m(\B(#~('..')))\(#g(\+)#r(\-))>\[#g;*(\M\A\R\D)#r;*(\m\a\u\d)]\{#m;*;_(\h('@'))}" long example gist
"\(#m;*(\b)#g(\+)#r(\-))\[#g(\M\A\R\D)#r(\m\a\u\d)]\{#m;_(\h('@'))}':'" short example gist
"#g;*(\b)#y(\B(#~('..')))\[#g(\+(#~('ahead ')))]\[#r(\-(#~('behind ')))]' '#g;_(\M\A\R\D)#r;_(\m\a\u\d)" git status sb example gist

背景

大多数shell都提供自定义shell提示符的功能,该提示符出现在每条命令之前。在我的系统中,默认提示符如下

gwen@tpy12:~/Documents/dev/util/gist$

它的目的是提供有关shell的有用信息。然而,它通常不包含有关git仓库的信息,这需要几乎不断使用 git status 来了解仓库的状态。解决方案是设置提示符命令并动态更新shell,以包含您想要的信息。 gist 正是为了这个目的而设计的:您可以提供一个格式,gist将解释它,并在您想要的格式中插入信息。

创建自己的gist格式

语言

例如:"\<\b\(\+\-)>\[\M\A\R\D':'\m\a\u\d]\{\h('@')}':'" 可能会产生以下内容 <master(+1)>[M1:D3]{@5}: 其中

  • master 是当前分支的名称。
  • +1:表示我们比远程分支领先1个提交
  • M1:表示暂存更改的数量
  • D3:表示未暂存删除文件的数量
  • @5:表示stashes的数量

gist 表达式也支持内联格式表达式,用于将文本设置为红色、加粗、使用ANSI终端转义序列或为您的git信息设置RGB颜色。

语法

gist 表达式有四种基本表达式类型

  1. 命名表达式
  2. 格式表达式
  3. 分组表达式
  4. 字面量

字面量

单引号之间的任何字符为字面量,除反斜杠和单引号外。字面量保持不变。例如,'literal' 输出 literal

命名表达式

命名表达式表示关于您的git仓库的信息。

名称 含义 示例
\b 分支名称或头提交ID master
\B 远程名称 origin/master
\+ 比远程分支领先的提交数 +1
\- 比远程分支落后的提交数 -1
\m 未暂存修改文件的数量 M1
\a 未跟踪文件的数量 ?1
\d 未暂存删除文件的数量 D1
\u 合并冲突的数量 U1
\M 暂存修改文件的数量 M1
\A 添加文件的数量 A1
\R 重命名文件的数量 R1
\D 暂存删除文件的数量 D1
\h 暂存文件的数量 H1

您可以为替换默认前缀的表达式提供其他表达式作为参数,该前缀出现在结果或文件计数之前。例如,\h('@') 如果您的仓库有3个暂存文件,则将输出 @3 而不是 H3。您可以为另一个命名表达式提供任意数量的有效表达式作为前缀。

分组表达式

Gist将分组表达式用括号或方括号括起来,如果分组为空,则打印无内容。

结果
\[]
\()
\<>
\{}
\{\b} {master}
\<\+\-> <+1-1>
\[\M\A\R] [M1A3] 其中 \R 为空
\[\r\(\a)] 空,当 \r\a 为空时

格式表达式

Gist表达式通过以下样式支持ANSI终端格式化

格式 含义
#~(...) 重置
#_(...) 下划线文本
#i(...) 斜体文本
#*(...) 粗体文本
#r(...) 红色文本
#g(...) 绿色文本
#b(...) 蓝色文本
#m(...) 洋红色/紫色文本
#y(...) 黄色文本
#w(...) 白色文本
#k(...) 亮黑色文本
#[01,02,03](...) 24位RGB文本颜色
#R(...) 红色背景
#G(...) 绿色背景
#B(...) 蓝色背景
#M(...) 洋红色/紫色背景
#Y(...) 黄色背景
#W(...) 白色背景
#K(...) 亮黑色背景
#{01,02,03}(...) 24位RGB背景颜色
#01(...) 固定终端颜色

格式样式可以通过分号分隔在单个表达式中组合

格式 含义
#w;K(...) 白色文本,黑色背景
#r;*(...) 红色加粗文本
#42(...) 一种森林绿色
#_;*(...) 下划线加粗文本

依赖关系

~13MB
~313K SLoC