在 Debian 中,如何更改 X(通过 setxkbmap)和(内核)虚拟控制台(TTY)使用的单个用户特定文件中的键盘映射?

在 Debian 中,如何更改 X(通过 setxkbmap)和(内核)虚拟控制台(TTY)使用的单个用户特定文件中的键盘映射?

这不是重复的以与 X/控制台无关的方式更改控制台 (tty) 和 X 上的键盘布局/映射?,其中一个全系统 /etc/default/keyboard正在讨论。

我正在寻找使用特定于用户的文件~/.keyboardxkb其设置由 X(例如,+ LXDE)以及(内核)虚拟控制台(VT/TTY)使用。

从 中可以看出,如果运行时保留用户环境,cat $(which setupcon)虚拟控制台可以拾取特定于用户的~/.keyboard文件(或其一个):VARIANTsetupcon

sudo -E setupcon

其中setupcon(或多或少)将基于 xkb 的~/.keyboard设置(XKBMODELXKBLAYOUTXKBOPTIONS等)转换为控制台键盘映射类型(通过ckbcomp)并将loadkeys结果转换为控制台。如果用户的环境没有被保留,

sudo setupcon

然后/etc/default/keyboard被拾起。

然而,据我所知,X 中setxkbmap仅获取系统范围的/etc/default/keyboard文件。用户特定的信息~/.keyboard不会被拾取setxkbmap。但这正是我所需要的。换句话说,我正在努力~/.keyboard喂食setxkbmap。我希望能够在 X 登录时完成此操作(例如,使用 中的一行~/.xsessionrc),并且能够对 X 中的 while 进行更改并通过(不使用)~/.keyboard应用它们,就像提供一样。setxkbmapsudosetxkbmap -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

相关内容