使用旧的Rust 2015
0.1.0 |
|
---|
#10 in #gist
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('@'))}" |
|
"\(#m;*(\b)#g(\+)#r(\-))\[#g(\M\A\R\D)#r(\m\a\u\d)]\{#m;_(\h('@'))}':'" |
|
"#g;*(\b)#y(\B(#~('..')))\[#g(\+(#~('ahead ')))]\[#r(\-(#~('behind ')))]' '#g;_(\M\A\R\D)#r;_(\m\a\u\d)" |
背景
大多数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
表达式有四种基本表达式类型
- 命名表达式
- 格式表达式
- 分组表达式
- 字面量
字面量
单引号之间的任何字符为字面量,除反斜杠和单引号外。字面量保持不变。例如,'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