在 bash 中的 C++ 输出中设置制表符宽度

在 bash 中的 C++ 输出中设置制表符宽度

我有一个c++程序,我使用制表符"\t"将输出组织到人类可读的列中。然而,bash 中 8 个空格宽的列对我来说太窄了。我怎样才能增加它?

笔记:在 C++ 论坛上人们说:“C++只输出字符,不负责可见输出”。在linux论坛上人们说:“大概是你用来输出到终端的程序负责的less。”

答案1

您可以使用终端数据库更改终端中的制表位,您可以通过多种方式从 C++ 访问该数据库(例如 ncurses)。您还可以使用 shell 从 shell 访问它tput

您需要首先清除选项卡 ( tput tbc)。然后将光标移动到要在其中添加制表位的每一列(tput hpa 10例如,第 10 列)。最后设置制表位 ( tput hts)。对所需的每个制表位重复定位和制表位设置。例子:

echo -e '0\t1\t2\t3\t4\t5\t6\t7\t8'
tput tbc
for ((i=0; i<`tput cols`; i+=10)); do
    tput hpa $i
    tput hts
done
tput hpa 0
echo -e '0\t1\t2\t3\t4\t5\t6\t7\t8'

答案2

因此,打印的制表符在程序的源代码中是固定的。我不认为 bash 中制表符的显示可以在 shell 设置中编辑。

我只是在这里猜测,但我认为制表符的表示形式嵌入到终端程序正在使用的字符编码集中。 ASCII字符集定义了制表符,但UTF-8字符集定义了制表符似乎没有。我不认为任何字符编码集对制表符使用不同的宽度,所以我认为你运气不好,除非你想编写自己的字符集并使用它,但这听起来像是一个令人头痛的事情。

相反,您尝试过该pr命令吗?

PR(1) 用户命令 PR(1)

名称 pr - 转换文本文件以进行打印

要将制表符替换为 10 个空格,您可以这样做:-

./a.out | pr --expand-tabs=10 -t

答案3

C++ 不负责宽度。我写了一个较长的回复,但当我进行测试时,它真的变得不必要了......

基本上,使用tabs(ncurses5 包的一部分)...例如

zsh> tabs 4 # 4 space width tabs
zsh> ./a.out

这将自动格式化为您想要的宽度。无需管道(如果您有交互式工作,这没有帮助)。

答案4

正如其他答案中所示,tabs实用程序是更简单的方法指定制表位适用于不设置自己的制表位的应用程序(例如您的 shell)。 POSIX 指定了一个tabs实用程序,(以及tputtput),但对于 terminfo 或为此目的的行为没有任何可说的。 (X/Open Curses 是一个单独的标准,确实有话要说)。

但要使用这些制表位,您还应该确保您的终端设置为使用硬件制表位。如果你这样做stty -atab0,在输出中查找:

speed 38400 baud; rows 40; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

根据stty手册,您应该能够设置tab0tab3。POSIX 定义tab1tab2,但只有tab0(硬件选项卡)和tab3(软件选项卡)对您有用。

tab0 tab3
选择选项卡扩展策略。 tab0禁用选项卡扩展,同时tab3启用它。

进一步阅读:

相关内容