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 每月下载量

MPL-2.0 许可证

91KB
2K SLoC

✨ glitter

Glit is an informative shell prompt

使用自定义格式的 Git 状态摘要,非常适合您的 shell 提示符

Crates.ioBuild Status

Glitter 是一个跨平台的命令行工具和格式语言,用于制作信息丰富的 git 提示。Glitter 的解释器 glit

  • 通过 git api 从您的 git 仓库读取状态信息
  • 解析和解释提供的格式
  • 将请求的信息以格式化输出到 stdout

Glitter 是一个二进制工具,提供惊人的速度,提供最大灵活性,安装简单。这使得 Glitter 成为 bash-git-promptzsh-git-promptposh-git 等工具的理想替代品。

Glitter 已在 Windows、Mac 和 Ubuntu 上进行测试;它在 Powershell、zsh、bash 以及理论上任何支持提示命令的 shell 环境中工作。

安装

转到 发布 页面并下载适用于您的平台的二进制文件。

确保 Glitter 已安装

$ glit "'hello from git'" -e "'hello'"

如果当前目录位于 git 仓库中,它将输出 hello from git;如果不在此,则输出 hello

从源代码构建

首先安装 rust 工具链cmakeopenssl,然后

$ 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提供了一种易于使用且易于原型设计的灵活表达式语言。

glit is easy to experiment with.

无颜色示例
example-3
"b..B({+-}) [MARD] \(maud) h"
紧凑示例
example-1
"[#c*(b)@#c(B):{+,-} | #~(#g(MARD):#r(maud):h('@'))]"
适合git初学者
example-2
"#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)] ra为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