Arch-Linux

為什麼 showconsolefont 在 tmux 中有不同的輸出?

  • November 8, 2016

我正在執行一個沒有視窗管理器或桌面環境的 arch linux 系統(現在)。當我需要多個終端時,我使用 tmux。當我sudo showconsolefont在我的 tty(沒有 tmux)上執行時,我看到了預期的符號集,但是當我打開 tmux 並執行時sudo showconsolefont,我看到了一組不同的重複符號。

我的字型是ter-124bTerminus 家族的。

在螢幕截圖中,頂部的輸出是從 tmux 中擷取的,看起來與我執行時的顯示方式相同sudo showconsolefont。底部輸出包含不同的符號,但如果我將它重定向到一個文件,然後cat是文件,它們看起來是一樣的。diff他們還報告說它們是相同的。

**為什麼 tmux 中 showconsolefont 的輸出不同?**我認為該命令的目的是以目前字型顯示所有可用符號。由於我在 tmux 內部和外部使用相同的字型,我不明白為什麼會有任何區別。我確定這裡缺少一些簡單的 linux 字型概念。有人可以向我指出嗎?

我嘗試檢查我$TERM是否在 tmux 中的值並確保它預設為linux(與我的 tty 中的相同$TERM),但這並沒有任何區別。( set -g default-terminal "linux")

簡而言之:tmux無法以一種字型顯示所有 256 個項目

長:

參考原始碼,這有點尷尬,因為(參見*KBD – Linux 鍵盤工具*網頁)更喜歡 tarball,但您可以使用 git-cloning 建議來瀏覽原始碼。該showconsolefont程序這樣做

  • 打開指定的設備,
  • 驗證它是一個控制台
  • 獲取目前模式,查看是否使用 UTF-8,
  • 製作一個虛擬(平凡的)螢幕地圖
  • 獲取目前的螢幕地圖
  • 列印數組…
  • 對於每一行,它重新映射數組中的字元以顯示字型
  • 恢復控制台的模式和螢幕映射

之所以showconsolefont可以顯示 256 個項目(而不是說 256 - 32 個控製字元)是因為它重新映射了直接發送到控制台的程式碼。實際上那將是33 個控制項,因為0x9b處理方式不同。足夠近。 showconsolefont正在編寫看似可列印的字元,但正在逐行更改實際繪製的字元。

您可能注意到的一件事是,對控制台設備的所有更改都使用實際設備的文件描述符,而字元數組則寫入標準輸出。當您在 tmux外部執行時,它們是相同的 device。但是在裡面 tmux執行,標準輸出是到不同的設備(一個偽終端,它將特殊映射與字元分開。如果你將shell重定向到控制台,例如,

$ tmux
$ sudo su -
# exec >/dev/console
# showconsolefont

您將能夠看到部分有趣的角色。但是偽終端不會按預期顯示輸入/換行,並且tmux可能無法正確繪製狀態行:

在 tmux 中重定向 showconsolefont

與(外部tmux):

普通的showconsolefont

可能有一種方法可以設置 root 的終端模式以獲得可讀的輸出,但如果沒有一些工作,這不是showconsolefont或不會做的。tmux

引用自:https://unix.stackexchange.com/questions/321784