在 GUI 终端中设置标签宽度

Ema*_*erg 4 terminal xterm rxvt

我找到

setterm -regtabs 4
Run Code Online (Sandbox Code Playgroud)

在 xterm 或 urxvt 中不起作用。

但是这个

xterm_set_tabs () { 
  TERM=linux;
  export $TERM;
  setterm -regtabs 4
}
Run Code Online (Sandbox Code Playgroud)

将规避问题。

但是,我怀疑它是次优的,因为 (1) 我得到了一个我无法解释的 gfx 错误(至少,如果我把选项卡的东西弄对了,那可能性就被排除了),以及 (2) 当我 ssh 到我学校的Solaris,然后运行emacs -nw,它说终端“linux”是未知的!那么我必须把它改回“xterm”。当然,这很愚蠢,因为我一直在使用同一个终端。

此外,也许根本不依赖标签是一个很好的经验法则!

Tho*_*key 5

setterm实用程序旨在与 Linux 控制台一起使用。根据console_codes 手册页

Linux 控制台实现了 VT102 和 ECMA-48/ISO 6429/ANSI X3.64 终端控件的一大子集,以及用于更改调色板、字符集映射等的某些专用模式序列。

由于程序是硬编码的

/* -regtabs. */
if (ctl->opt_regtabs && vc_only(ctl, "--regtabs")) {
    int i;

    fputs("\033[3g\r", stdout);
    for (i = ctl->opt_rt_len + 1; i <= TABS_MAX; i += ctl->opt_rt_len)
        printf("\033[%dC\033H", ctl->opt_rt_len);
    putchar('\r');
}
Run Code Online (Sandbox Code Playgroud)

它恰好适用于 xterm,因为 xterm 实现了VT100 控件(以及更多控件)

至于大的子集,这是有争议的。在快速计算 中的项目时console_codes,我看到了 79 个控制序列。通过计算控件,这远低于 xterm FAQ Comparing versions 中记录的任何 xterm 相似之处。79 本身并不大。VT102 本身(不是类似 xterm 的)有 104 个。ISO-6429(又名ECMA-48)记录了 20 个模式和 162 个序列。无论您将总数计算为 182 还是 162,50% 都不是一个很大的子集

除了使用 Linux 控制台实用程序,还有一个更便携的选择:tabs实用程序(在POSIX和 Solaris 中)。它是ncurses 实用程序的一部分(可能安装在您的 Linux 系统上)。

对于问题中给出的示例,您可以这样做:

tabs -4
Run Code Online (Sandbox Code Playgroud)

这使用终端数据库,而不是硬编码。选项卡和设置它们的控制序列记录在 ECMA-48 和其他地方,例如terminfo(5)手册页。

tabs与 xterm 一起使用。

  • 我这辈子的*那个*去哪儿了?我使用的某些程序总是会弹出制表位,而且我不知道(或关心)它是哪一个。我只是想恢复我的制表位。劫持问题以便我将其标记为已回答的程序是什么?令人尴尬的是,一个简单的“man -k tab|grep -i -v table |grep -i -v database”就会在“几十年”前发现它。 (2认同)

Sté*_*las 4

许多终端支持设置制表位的转义序列。该功能甚至在 terminfo(5) 中有一个条目:tbc(清除所有选项卡)和 hts(水平选项卡集)。

$ tput tbc; echo aaaaaaaaaaaaaaaaaaaaa$(tput hts); echo 'a\tb'
aaaaaaaaaaaaaaaaaaaaa
a                    b
Run Code Online (Sandbox Code Playgroud)

上面我们在 aaaaaaaa 的末尾设置了一个制表位,我们在下一行看到结果。

因此,要设置每 4 列制表位,我们需要:

tbc=$(tput tbc) hts=$(tput hts) cuf4=$(tput cuf 4)
printf '%s\r' "$tbc"
i=4
while [ "$i" -lt "$COLUMNS" ]; do
  printf %s "$cuf4$hts"
  i=$(($i + 4))
done
printf '\r'
Run Code Online (Sandbox Code Playgroud)

或者您也可以以不规则的间隔设置制表位。上面我们使用“tput cuf”向前移动光标,而在第一个示例中我们使用“aaaa”。你可以做:

printf '\r%s' "${tbc}aaaa${hts}aaaaa${hts}aaaaaaaa${hts}"
Run Code Online (Sandbox Code Playgroud)

在第 4 列设置一个制表位,然后是下一个,再往前 5 列...