Keyboard

在 Debian 中,如何更改單個 USER-SPECIFIC 文件中的鍵盤映射以供 X(通過 setxkbmap)和(核心)虛擬控制台(TTY)使用?

  • December 16, 2020

這不是以與 X/控制台無關的方式更改控制台 (tty) 和 X 上的鍵盤佈局/映射的副本嗎?,其中討論了系統範圍 /etc/default/keyboard

我正在尋找一個使用者特定的文件,~/.keyboard,它的xkb設置被 X(例如,+ LXDE)以及(核心)虛擬控制台(VT/TTY)使用。

從 中可以看出,如果在執行時保留了使用者的環境cat $(which setupcon),則虛擬控制台可以獲取使用者特定的~/.keyboard文件(或其中的一個) :VARIANT``setupcon

sudo -E setupcon

setupcon(或多或少)將基於 xkb 的~/.keyboard設置(XKBMODEL、、、XKBLAYOUTXKBOPTIONS)轉換為控制台鍵盤映射類型(通過ckbcomp)並將loadkeys結果轉換為控制台。如果不保留使用者的環境,

sudo setupcon

然後/etc/default/keyboard被撿起來。

但是,據我所知,在 X 中setxkbmap只獲取系統範圍的/etc/default/keyboard文件。使用者特定~/.keyboard的不被 拾取setxkbmap。但這就是我需要的。換句話說,我正在嘗試~/.keyboard餵給setxkbmap. 我希望能夠在 X 登錄時完成此操作(例如,在 中使用一行~/.xsessionrc),以及能夠~/.keyboard在 X 中進行更改並通過setxkbmap(不使用sudo)應用它們,就像setxkbmap -option提供的那樣。

請注意,我並不是要手動創建使用者特定的 xkb 目錄層次結構並將其與xkbcomp -I. 但是,如果有一種自動化的方法可以將其~/.keyboard作為輸入,那麼這可能是一種可接受的解決方法。

到目前為止,我看到的唯一方法是 hack:手動 parse ~/.keyboard,提取XKBOPTIONS然後setxkbmap -option為每個編寫一個等價物。我不敢相信這種黑客攻擊是唯一的方法,儘管看到https://who-t.blogspot.com/2020/02/user-specific-xkb-configuration-part-1.html讓我質疑這種信念。

到目前為止,我正在使用帶有 X (+ LXDE) 的 Debian。我認為這對 Wayland 沒有影響,但如果有,請解釋一下。

如果它對其他人有用,這是我上面提到的我現在最終使用的 hack。

~/bin/setxkbmap.sh解析~/.keyboard、提取 xkb 設置並在 X 中執行等效的 setxkbmap 命令。 ~/bin/setxkbmap.sh可以手動呼叫,也可以在 X 啟動時通過例如 中的一行自動呼叫 ~/.xsessionrc

~/bin/setxkbmap.sh:

#!/bin/bash
# Parse ~/.keyboard, extracting the xkb settings, and run equivalent
# setxkbmap command(s) in X.

source ~/.keyboard
setxkbmap_cmd=(setxkbmap -model "${XKBMODEL}")
setxkbmap_cmd+=(-layout "${XKBLAYOUT}")

# Clear previously-set options first; otherwise, these will be
# appended to whatever is already there.
setxkbmap_cmd+=(-option)

# -r      : do not allow backslashes to escape any characters
# -a array: assign the words read to sequential indices of the array
#           variable ARRAY, starting at zero
IFS=',' read -r -a xkbopts <<< "${XKBOPTIONS}"
for opt in "${xkbopts[@]}"; do
   setxkbmap_cmd+=(-option "${opt}")
done

"${setxkbmap_cmd[@]}"

~/.keyboard:

XKBMODEL="pc105"
XKBLAYOUT="us"

# ctrl: specifies options coming from /usr/share/X11/xkb/symbols/ctrl
# file.
XKBOPTIONS="ctrl:menu_rctrl,ctrl:nocaps,ctrl:swap_rwin_rctl,terminate:ctrl_alt_bksp"

~/.xsessionrc:

# ~/.xsessionrc is sourced by Xsession (a sh script), everytime an X
# session is started. See 'man xsession' for details.

# Explicitly use bash, as ~/.xsessionrc is called by sh (dash in
# Debian 9 GNU/Linux).
bash ~/bin/setxkbmap.sh

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