为什么 showconsolefont 在 tmux 中有不同的输出?

为什么 showconsolefont 在 tmux 中有不同的输出?

我正在运行一个没有窗口管理器或桌面环境的 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 内重定向 showconsolefont

与(外部tmux):

普通显示控制台字体

可能有一种方法可以设置 root 的终端模式以获得可读输出,但这不是showconsolefont或者tmux不需要做一些工作就可以实现的。

相关内容