我有一个来自Gary Bernhardt 的点文件它会打印出最近 git 提交的漂亮彩色列表。它使用命令column
将输出排列成列。在我的 Mac 上,它运行良好。
然而奇怪的是,当我在 Cygwin 或 CentOS 6 上运行它时,列位不起作用。所有字段之间都有三个空格,无论它们的长度如何,都会在“列”之间产生锯齿状的间距。我已将其缩小到 ANSI 颜色转义码。如果我删除它们,列就会对齐。
这三个版本的 zsh 是相同的(而且问题在 bash 中出现的方式完全相同)。我无法判断的版本是什么column
,但它们看起来完全相同,而且它们的手册页也完全相同。
为什么这在我的 Mac 上可以运行,但在其他操作系统上却不行?
答案1
从下一个版本 v2.40 开始util-linux/柱子将处理包含的文本Fe 转义序列从ANSI 转义码适当地。
和这一改变,输出具有 ANSI 序列的文本的程序将被正确处理,如以下示例所示:
$ tput cols
108
$ echo BEFORE; ls -1 --sort=time --color=always | head -n 19 | column
BEFORE
column-test.sh test_enosys test_pathnames
column-pr.md test_mkfds test_sha1
tests test_uuid_namespace lib
ansiescape-test.txt test_tiocsti test_md5
column test_sigreceive test_byteswap
text-utils test_sysinfo
column-old.c test_strerror
$ echo REFERENCE; ls -1 --sort=time --color=never | head -n 19 | column
REFERENCE
column-test.sh text-utils test_tiocsti test_sha1
column-pr.md column-old.c test_sigreceive lib
tests test_enosys test_sysinfo test_md5
ansiescape-test.txt test_mkfds test_strerror test_byteswap
column test_uuid_namespace test_pathnames
$ echo AFTER; ls -1 --sort=time --color=always | head -n 19 | column
AFTER
column-test.sh text-utils test_tiocsti test_sha1
column-pr.md column-old.c test_sigreceive lib
tests test_enosys test_sysinfo test_md5
ansiescape-test.txt test_mkfds test_strerror test_byteswap
column test_uuid_namespace test_pathnames
答案2
column
按字符进行工作。它计算每个单元格的可打印字符,然后填充以对齐它们(参见代码源适用于 v2.29)。
您面临的问题是您的流包含不可打印的ANSI 转义序列嵌入可打印字符。column
然后无法计算这些单元格的实际单元格最小宽度,并且使同一行的下一个单元格未对齐。
<esc>[34m
以下是单元格颜色代码为蓝色的示例A
,使用列 v2.29:
$ echo '\033[34mA\033[0m B\nC D'|column -t
A B
C D
A
由于只有两个转义字符被检测为不可打印,因此单元格被视为高度可打印字符长。因此,C 列被赋予了七个不需要的填充空格。
请注意,此行为在各个版本的 column 中并不一致。版本 2.26 使用wcswidth
计算单元格可见宽度并导致不同的错位。
答案3
对于任何来到这里并且有兴趣获得column
类似输出的人来说,但是颜色代码和美国国家标准转义序列,我制作了一个版本,它具有相同的语法(对于column
支持的标志)并呈现输出符合预期。
我在网上找到了各种解决方案,但它们都使用了Bash
循环,与Perl
,我用过。
您可以找到脚本这里。
它可以直接执行(./column_ansi.sh [--options]
)或获取(source ./column_ansi.sh
,在这种情况下命令将作为 可用column_ansi
)
答案4
命令可能会column
查看$TERM
和/或$LANG
了解什么(如果有的话)构成了颜色代码。
当然,您可以直接使用git log --pretty=format:...
来输出列对齐的颜色编码日志。例如,我使用git hist
并在 中有这个~/.git/config
:
[alias]
hist = log --pretty=format:\" \t%C(yellow)%h %C(red)%ad %C(cyan)%aN%C(reset) \t| %s%C(blue)%d%C(reset)\" --graph --date=short