Ubuntu

為什麼在純控制台和 X 下 Compose 鍵的行為不同?

  • February 11, 2021

我正在 Xubuntu 20.04 中設置鍵盤佈局。

我通常希望能夠使用相同的擊鍵在純控制台和 X 中輸入各種 Unicode 字元。我知道控制台對 Unicode(512 字形)的支持有限,所以我可以接受控制台只在這個有限範圍內工作。

我在 xfce4-keyboard-settings 中保持“使用系統預設值”打開,將此選項理解為“使用/etc/default/keyboard設置”,並希望為純控制台和 X 提供一個配置。

我已經跑sudo dpkg-reconfigure keyboard-configuration了,我選擇了“美國國際,帶有 AltGr 死鍵”佈局變體。

我發現在純控制台 bash 中,通過進入“(arg:x)”模式會弄亂一些 AltGr 序列,在Google上搜尋到與一些 readline 特性相關,並且暫時認為這是離題,排除了這種行為從最簡單sh的 bash 開始。

在這一點上,我很高興鍵盤佈局在控制台和 X 下的工作方式似乎相同: AltGr+2 輸入², AltGr+` 然後 e 輸入è

對於 Compose 鍵,我選擇了 Caps Lock。

在 X 下,預期行為:在度數符號中編寫 oo 類型,在歐元符號中編寫 e = 類型,等等。

但是在控制台中,幾乎沒有 Compose 序列似乎可以工作。沒有學位,沒有歐元(雖然它們可以完美地顯示,甚至可以通過 AltGr 輸入)。Compose 鍵並非完全沒用,因為它仍然適用於 Compose ` e making up è等最基本的組合。但這比 512 個字形還要有限。

那麼為什麼控制台 Compose 行為如此不同,並且可以對其進行調整以至少支持像度數和歐元這樣看似簡單的東西嗎?

控制台行為不同,因為它由完全不同的程式碼處理。/etc/default/keyboard包含XKB的設置,它是 X 處理鍵盤輸入的一部分。控制台設置包將這些設置轉換為控制台能夠執行的操作,這要歸功於程序setupcon(讀取和解析/etc/default/keyboard)和ckbcomp(將 XKB 設置轉換為控制台設置)。這些工具受限於控制台的功能。

在核心內部實現的 Linux 控制台僅對多字節字元集有非常部分的支持。特別是關於 compose 鍵,核心中有一個硬編碼限制:除非您重新編譯核心¹,否則compose 表 ( accent_table)的硬編碼大小為 256。MAX_DIACR這可以解釋為什麼 console-setup 包沒有 Unicode 組合表:只有 256 個條目,無論你做什麼都不會覆蓋很多字元。據我所知,當您使用帶有 Unicode 字元集的控制台設置時,您最終會得到核心的內置 compose 表,該表僅列出 latin1 非 ASCII 重音字母(而不是標點符號,例如°) .

您可以定義自己的撰寫表。選擇最多 256 個兩個字元的組合以組合成第三個,並將它們列在控制台組合映射文件中。

Compose 'o' 'o' to degree
Compose 0x6f 0x006f to 0xb0
Compose U+6F U+006f to U+00B0

上面的第一行說明了Compose o o插入的不同方式°。當然你只需要一個。指定字元的方法是²:

  • 十進制數、帶前導的八進制數0或帶前導的十六進制數0x
  • 裡面的一個單字節字元'。該字元前可以有一個反斜杠,反斜杠和單引號必須加反斜杠:'\o'相當於'o',但反斜杠和單引號只能分別寫'\\''\'(或使用其他語法)。
  • '\*ooo*'其中ooo正好是 3 個八進制數字,指定的值最多為 255 ( \377)。
  • U+*hhhh*其中hhhh正好是 4 個十六進制數字。
  • only的右側to是一個字元的符號名稱。符號名稱是 X11 鍵符名稱的子集。有關符號名稱的列表,請參見原始碼 ( syms.*.h)

要載入您自己的撰寫地圖,請執行

loadkeys /path/to/my/compose.kmap

這將替換目前載入的撰寫表。

我找不到告訴控制台設置載入自定義組合地圖的方法。為非 Unicode 編碼ckbcomp載入,但對於 Unicode,它會跳過該步驟。/etc/console-setup/compose.${charmap}.inc

¹數組中的元素數是使用者空間可以設置的最大項目數。它可能需要設置為相同的值。kbdiacrucstruct kbdiacrsuc

² Source:原始碼(kbd包、文件src/libkeymap/analyze.lsrc/libkeymap/parser.y)。我在文件中找不到這些詳細資訊。

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