我正在运行一个没有窗口管理器或桌面环境的 arch Linux 系统(现在)。当我需要多个终端时,我使用 tmux。当我在 tty 上运行sudo showconsolefont
(没有 tmux)时,我看到了预期的符号集,但是当我打开 tmux 并运行时sudo showconsolefont
,我看到了一组重复的不同符号。
我的字体是ter-124b
,来自 Terminus 系列。
在屏幕截图中,顶部输出是从 tmux 中捕获的,看起来与我运行时的显示方式相同sudo showconsolefont
。底部输出包含不同的符号,但如果我将其重定向到一个文件,然后再重定向到cat
该文件,它们看起来是相同的。diff
分析它们还报告说它们是相同的。
为什么 tmux 中 showconsolefont 的输出不同?我认为该命令的重点是以当前字体显示所有可用符号。由于我在 tmux 内部和外部使用相同的字体,所以我不明白为什么有什么区别。我确信我在这里缺少一些简单的 Linux 字体概念。有人可以向我指出吗?
$TERM
我尝试检查我是否在 tmux 中的值并确保它默认为linux
(与我的 tty 中相同$TERM
),但这没有任何区别。 ( set -g default-terminal "linux"
)
答案1
简而言之:tmux
无法以字体显示所有 256 个项目
长的:
参考源代码,这有点尴尬,因为(参见KBD – Linux 键盘工具网页)更喜欢 tarball,但您可以使用 git-cloning 建议来浏览源码。这showconsolefont
程序执行此操作
- 打开指定的设备,
- 验证它是一个安慰,
- 得到当前模式,查看是否使用 UTF-8,
- 使虚拟(琐碎)屏幕地图
- 得到当前屏幕地图
- 印刷数组...
- 对于每一行,它重新映射数组中的字符以显示字体
- 恢复控制台的模式和屏幕映射
之所以showconsolefont
可以显示 256 个项目(而不是说 256 - 32 个控制字符)是因为它重新映射了直接发送到控制台的代码。其实那会是33控制,因为0x9b
处理方式不同。足够接近。 showconsolefont
正在编写看似可打印的字符,但正在逐行更改实际绘制的字符。
您可能注意到的一件事是,对控制台设备的所有更改都使用实际设备的文件描述符,而字符数组则写入标准输出。当你运行这个外部tmux,这些是同一设备。但跑步里面 tmux
,标准输出是不同的设备(一个伪终端,它将特殊映射与字符分开。如果将 shell 重定向到控制台,例如,
$ tmux
$ sudo su -
# exec >/dev/console
# showconsolefont
你将会看到部分有趣的人物。但伪终端不会按预期显示回车/换行,并且状态行tmux
可能无法正确绘制:
与(外部tmux
):
可能有一种方法可以设置 root 的终端模式以获得可读输出,但这不是showconsolefont
或者tmux
不需要做一些工作就可以实现的。