这不是重复的以与 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
、XKBLAYOUT
、XKBOPTIONS
等)转换为控制台键盘映射类型(通过ckbcomp
)并将loadkeys
结果转换为控制台。如果用户的环境没有被保留,
sudo setupcon
然后/etc/default/keyboard
被拾起。
然而,据我所知,X 中setxkbmap
仅获取系统范围的/etc/default/keyboard
文件。用户特定的信息~/.keyboard
不会被拾取setxkbmap
。但这正是我所需要的。换句话说,我正在努力~/.keyboard
喂食setxkbmap
。我希望能够在 X 登录时完成此操作(例如,使用 中的一行~/.xsessionrc
),并且能够对 X 中的 while 进行更改并通过(不使用)~/.keyboard
应用它们,就像提供一样。setxkbmap
sudo
setxkbmap -option
请注意,我并不是尝试手动创建特定于用户的 xkb 目录层次结构并将其与xkbcomp -I
.但是,如果有一种自动方法可以作为~/.keyboard
输入来执行此操作,那么这可能是一个可接受的解决方法。
到目前为止,我看到的唯一方法是 hack:手动解析~/.keyboard
、提取XKBOPTIONS
,然后setxkbmap -option
为每个方法编写等效的方法。我不相信这个黑客是唯一的方法,尽管看到https://who-t.blogspot.com/2020/02/user-specific-xkb-configuration-part-1.html让我质疑这个信念。
截至目前,我正在使用 Debian 和 X (+ LXDE)。我认为这对 Wayland 没有什么影响,但如果有的话,请解释一下。
答案1
如果它对其他人有用,这是我上面提到的我现在最终使用的技巧。
~/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