8 个版本
0.3.0 | 2019年9月24日 |
---|---|
0.2.2 | 2019年9月17日 |
0.2.1 | 2019年8月25日 |
0.1.3 | 2018年2月11日 |
#143 in 值格式化
26 每月下载量
91KB
2K SLoC
✨ glitter
使用自定义格式的 Git 状态摘要,非常适合您的 shell 提示符
Glitter 是一个跨平台的命令行工具和格式语言,用于制作信息丰富的 git 提示。Glitter 的解释器 glit
将
- 通过 git api 从您的 git 仓库读取状态信息
- 解析和解释提供的格式
- 将请求的信息以格式化输出到
stdout
Glitter 是一个二进制工具,提供惊人的速度,提供最大灵活性,安装简单。这使得 Glitter 成为 bash-git-prompt
、zsh-git-prompt
和 posh-git
等工具的理想替代品。
Glitter 已在 Windows、Mac 和 Ubuntu 上进行测试;它在 Powershell、zsh、bash 以及理论上任何支持提示命令的 shell 环境中工作。
安装
转到 发布 页面并下载适用于您的平台的二进制文件。
确保 Glitter 已安装
$ glit "'hello from git'" -e "'hello'"
如果当前目录位于 git 仓库中,它将输出 hello from git
;如果不在此,则输出 hello
。
从源代码构建
首先安装 rust 工具链、cmake
和 openssl
,然后
$ cargo install glit
设置您的 shell
安装 Glitter 后,您需要将其设置为更新提示符。
Bash
将以下片段添加到您的 ~/.bashrc
或直接粘贴到 shell 中以尝试它,而不做任何永久性更改。
# Format to use inside of git repositories or their sub-folders
export GIT_FMT="#g*(b)..#r(B)[+('↑')-('↓'), #~(#g(MARD):#r(maud)), h(#m('@'))]:#b*('\w')'\n\$ '"
# Format to use outside of git repositories
export PS1_FMT="#g(#*('\u')@'\h'):#b*('\w')'\$ '"
__set_prompt() {
PS1="$(glit "$GIT_FMT" -b -e "$PS1_FMT")"
}
export PROMPT_COMMAND=__set_prompt
Powershell
将以下片段添加到您的 $PROFILE
或直接粘贴到 shell 中以尝试它,而不做任何永久性更改。
# Format to use inside of git repositories
$GIT_FMT=":#y([#c*(b) #c(B):#~(+,-) | #~(#g(MARD):#r(maud):#m(h('@')))])"
function prompt {
$path = $(get-location)
glit "'$path'$GIT_FMT'> '" -e "'$path> '"
}
zsh
将以下代码片段添加到您的~/.zshrc
文件中,或者直接在shell中粘贴代码片段以尝试它,而无需进行任何永久更改。
# Format used in a git repository
export GIT_FMT="#g*(b)..#r(B)[+('↑')-('↓'), #~(#g(MARD):#r(maud)), h(#m('@'))] #b*('%~')"
# Fallback format used outside of git repositories
export PS1_FMT="#g*('%m')#b*('%~')"
precmd() { print -rP "$(glit "$GIT_FMT" -b -e "$PS1_FMT")" }
PROMPT="%# "
fish
将您的~/.config/fish/functions/fish_prompt.fish
文件替换为,或者直接在shell中粘贴代码片段以尝试它,而无需进行任何永久更改。
function fish_prompt
set -l path (prompt_pwd)
# format used in git repositories
set git "#g*(b)..#r(B)[+('↑')-('↓'), #~(#g(MARD):#r(maud)), h(#m('@'))] #y('$path')'\n> '"
# fallback format used outside of git repositories
set ps1 "#y('$path ')'> '"
echo -e (glit $git -e $ps1)
end
自定义格式
Glitter提供了一种易于使用且易于原型设计的灵活表达式语言。
无颜色示例 |
---|
"b..B({+-}) [MARD] \(maud) h" |
紧凑示例 |
---|
"[#c*(b)@#c(B):{+,-} | #~(#g(MARD):#r(maud):h('@'))]" |
适合git初学者 |
---|
"#g*(b)..#r(B)[#g(+(#~('ahead '))), #r(-(#~('behind '))), #~(#g(MARD)#r(maud)), h('stash ')]" |
与git status -sb 提供的信息紧密匹配 |
Glitter格式由4种类型的表达式组成
- 信息表达式
- 分组表达式
- 字符串
- 分隔符
- 格式表达式
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 |
您可以为替换默认前缀的表达式提供其他表达式作为参数,该前缀出现在结果或文件计数之前。例如,如果您存储库有3个暂存,\h('@')
将输出@3
而不是H3
。您可以为任何这些表达式提供任意数量的有效表达式作为参数。
$ glit "b"
master
$ glit "b('on branch ')"
on branch master
表达式通常仅在它们对应的值不为空时才生成任何输出;换句话说,如果没有添加文件,glit
不会将A0
作为\A
的输出,而是输出一个空字符串。
分组
Glitter会在分组表达式中添加括号或方括号,如果分组为空,则不会打印任何内容。
宏 | 结果 |
---|---|
[] |
空 |
\(a) |
(?1) ;注意前面的\ |
<> |
空 |
{} |
空 |
{b} |
{master} |
<+-> |
<+1-1> |
[MAR] |
[M1A3] 其中R 为0 |
[r\(a)] |
当r 和a 为0时为空 |
$ glit "b<M>"
字符串
单引号之间的任何字符都是字符串。字符串在输出中保持不变;例如,'exact'
输出exact
。
$ glit "'hello world'"
hello world
$ glit "'\n\w\n\u'"
\n\w\n\u
$ glit "'separate' 'words'"
separate words
分隔符
分隔符出现在表达式之间,有助于区分或分组它们。支持的分隔符有
分隔符 | 符号 |
---|---|
空格 | |
条/管道 | | |
在 | @ |
下划线 | _ |
冒号 | : |
分号 | ; |
逗号 | , |
点 | . |
两个表达式之间可以使用任意数量的分隔符
$ glit "'hello', 'world'"
hello, world
$ glit "b@B::'git'"
master::git # there is no tracking branch (B)
master@origin/master::git # there is a tracking branch (B)
$ glit "b[+] | B"
master[+1] | origin/master # ahead 1 commit of tracking branch
master | origin/master # no difference between master and tracking
如果组中任何表达式在它之前打印过,并且表达式紧随其后打印任何内容,则分隔符始终会打印。
glit "b [..B..]" # [..B..] is a separate group
master [origin/master] # nothing prints before or after B
这可能导致以下意外的行为
$ glit "b MA"
master M1A1 # 1 staged change, 1 new file
masterA1 # no staged changes, 1 new file
解决方案是将随后的表达式以某种方式进行分组
$ glit "b [MA]"
master [A1]
$ glit "b #~(MA)" # tip: use reset style
master A1 # notice no extra output
格式化文本
Glitter表达式通过以下样式支持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背景颜色 |
格式样式可以通过简单的组合在单个表达式中结合
格式 | 意义 |
---|---|
#wK('...') |
白色文本,黑色背景 |
#r*('...') |
红色加粗文本 |
#g_('...') |
绿色下划线文本 |
#~_*('...') |
带有重置颜色的下划线加粗文本 |
$ glit "#r*('hello world')"
$ glit "#g*(b)"
$ glit "#[255,175,52]('orange text')"
$ glit "#G('green background')"
glit
可以理解和尊重复杂的嵌套样式,提供最大的灵活性。
$ glit "#g('green text with some '#*('bold')' green text')"
$ glit "#g*(b(#~('on branch ')))"
依赖关系
~16–25MB
~455K SLoC