我有这个~/.gitconfig
别名:
b = "!r() { count=10; git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:bold green)%(committerdate:relative)|%(color:yellow)%(refname:short)|%(color:red)%(objectname:short)%(color:reset)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:=10} | column -c 10 -ts '|'; }; r"
我对这个函数的问题是它根据最长的行格式化字符串,即如果我有一个包含以下值的表(这不是 的输出,只是说明行为的git branch --format
示例column
):
a, b, c
x, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, z
然后它看起来像
a, b , c
x, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, z
这是一个很好的行为column
,但我想修剪字符串长度,因此,例如,没有列会长> 4:
a, b , c
x, yyyy, z
我设法添加一个管道awk
来执行类似的操作(使用了 25 个字符):
b = "!r() { count=10; git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:bold green)%(committerdate:relative)|%(color:yellow)%(refname:short)|%(color:red)%(objectname:short)%(color:reset)|%(color: blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:=10} | column -c 10 -ts '|' | awk '{for(i=1;i<NF;i++){$i=substr($i,1,25)}; print $0}'; }; r"
但它弄乱了桌子:(
*
它在当前分支的开头也会出现错误。
我怎样才能解决这个问题?
- 我尝试安装一个较新的版本,
column
该版本应该有一个-c
控制宽度的选项,但我不能:((从下载这里然后尝试./configure && make install
。没有按预期工作)。 - 尝试使用换行符格式化函数
\
- 没有成功。函数必须gitconfig
看起来这么难看吗?
$ git --version
git version 2.34.1
答案1
如果您无法访问column
了解输出宽度限制的实现,一种方法是在awk
.然而,实现逻辑——虽然很简单——会增加函数的长度gitconfig
:
awk -F'|' -v maxw=4 '{for (i=1;i<=NF;i++) {l=length($i); if (l>maxw) l=maxw; if (l>mw[i]) mw[i]=l; lines[NR]=$0}}
END{for (j=1;j<=NR;j++) {n=split(lines[j],f,/\|/); for(i=1;i<=n;i++) {printf("%*s%s",mw[i],substr(f[i],1,maxw),i==n?ORS:OFS)}}}'
如您所见,该awk
程序将输入拆分为|
(这就是您所说的命令的实际输出git branch
)。
- 对于每一行,它都会迭代所有字段,并将
mw
每列的最大字段宽度存储在数组中,但仅限于变量 中指定的最大宽度maxw
。 - 然后它将每行的“原始”内容(包括原始字段分隔符)存储在缓冲数组中
lines
。 - 在输入结束时,它迭代缓冲区
lines
并再次将行分割|
成数组f
。对于 的每个条目f
,它最多maxw
通过 打印字段的字符printf
,其中所需的字段宽度是从mw
相应列的数组中获取的。
对于您的示例(但假设实际的|
-separation 而不是,
您显示的),输出将是:
a b c
x yyyy z