在 GUI 终端中设置制表符宽度

在 GUI 终端中设置制表符宽度

我找到

setterm -regtabs 4

在 xterm 或 urxvt 中不起作用。

但是这个

xterm_set_tabs () { 
  TERM=linux;
  export $TERM;
  setterm -regtabs 4
}

将规避该问题。

但是,我怀疑这是次优的,因为(1)我遇到了一个 gfx bug,我无法以其他方式解释(至少,如果我得到正确的选项卡内容,则排除了可能性),以及(2)当我 ssh 到我的学校时Solaris,并运行emacs -nw,它说终端“linux”未知!所以我必须把它改回“xterm”。当然,这很愚蠢,因为我一直使用同一个终端。

另外,也许根本不依赖选项卡是一个很好的经验法则!

答案1

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');
}

它恰好可以与 xterm 一起使用,因为 xterm 实现了VT100 控件(以及更多)

至于大子集,这是有争议的。快速计数 中的项目console_codes,我看到 79 个控制序列。这远远低于 xterm FAQ 中记录的任何 xterm 相似项通过计数控件来比较版本。就其本身而言,79 并不大。 VT102 本身(与 xterm 相似)有 104。ISO-6429(又名ECMA-48) 记录了 20 种模式和 162 个序列。无论总数是 182 还是 162,50% 都不是大子集

除了使用 Linux 控制台实用程序之外,还有一种更便携的选择:tabs实用程序(在POSIX以及 Solaris)。它是ncurses 实用程序(并且可能安装在您的 Linux 系统上)。

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

tabs -4

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

tabs与 xterm 一起使用。

答案2

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

$ tput tbc; echo aaaaaaaaaaaaaaaaaaaaa$(tput hts); echo 'a\tb'
aaaaaaaaaaaaaaaaaaaaa
a                    b

上面我们在 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'

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

printf '\r%s' "${tbc}aaaa${hts}aaaaa${hts}aaaaaaaa${hts}"

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

答案3

您可以临时设置环境变量,而无需使用以下命令将其导出到整个会话env

env TERM=linux setterm -regtabs 4

答案4

好的,我已经阅读过man xterm,但没有提到制表符宽度。我开始认为重置是最简单的TERM。在.bashrc

function xterm_set_tabs () {
  TERM=linux
  export $TERM
  setterm -regtabs 4
  TERM=xterm
  export $TERM
}

if [ `echo $TERM` == "xterm" ]; then
  xterm_set_tabs
fi

编辑:这适用于所描述的问题,但它有一个副作用,即当我运行时emacs -nw光标移动会变得混乱。由于情况非常严重,这不是一个可接受的解决问题的方案。 (我不确定网站政策 - 我应该删除我的答案,还是应该保留它,以便其他人也能从错误中吸取教训?显然,我认为它应该保留。无论如何,回到绘图板。)

相关内容