我找到
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
光标移动会变得混乱。由于情况非常严重,这不是一个可接受的解决问题的方案。 (我不确定网站政策 - 我应该删除我的答案,还是应该保留它,以便其他人也能从错误中吸取教训?显然,我认为它应该保留。无论如何,回到绘图板。)