3

我想在终端中输出与右侧完全对齐的彩色文本(如 pacman 的截图(arch linux 发行版的数据包管理器)(未着色))pacman 文本向右对齐

目前我正在使用format

import shutil
left = "foo"
right = "bar"
width = shutil.get_terminal_size().columns
template = "{left:30}{right:{width}}".format(left=left, right=right, width=width-30)
click.echo(template)
# click.echo works just like print with some additional features

这很好用,直到我通过 ANSI 转义码添加颜色:

left = click.style("foo", fg="red")
right = click.style("bar", fg="green")
# click.style just adds ANSI codes for colors and bold etc.

看起来像这样:在此处输入图像描述

即右侧不完全右对齐。哪个是“正确的”,因为right实际上\\x1b[32mbar\\x1b[0m哪个当然具有更高的长度bar,因此需要更少的空间来右对齐。直到终端得到文本并且只显示bar(带颜色)。

我是否遗漏了 python std lib 中的任何内容或单击?或者是否有一个处理终端颜色和对齐的简单库可以帮助我?或者这个问题有简单的解决方案吗?

4

2 回答 2

2

click的文档没有提到对齐(这就是你使用 python 的内置字符串类的原因)。click.style您可以通过告诉您的脚本在调用之前记住字符串的长度并将差异添加到用于格式调用的宽度来保持在当前的接口集内。(如果您将文本居中,这将无法正常工作)。

可能还有其他库,但您可以使用该函数的curses接口filter来绘制单行显示。

于 2015-08-11T22:26:48.740 回答
1

首先,我想弄清楚click提供一种获取终端大小的方法:click.get_terminal_size,文档在这里

>>> import click
>>> click.get_terminal_size()
>>> (66, 24)  # (width, height)

我的解决方案,即使您调整终端大小也应该有效:

width = click.get_terminal_size()[0]
left = click.style("foo", fg="red")
right = click.style("bar", fg="green")
print "{0:}{1:>{2}}".format(left, right, width+6)

由于right实际上是\x1b[32mbar\x1b[0m,我们手动增加宽度以避免该问题。

编辑:在 python 中进行字符串格式时, PyFormat对我很有用。它帮助我理解字符串格式。希望它会帮助你。

于 2015-09-10T13:48:40.133 回答