我最近安装了 Debian 9 并插入了我常用的~/.Xmodmap
文件并添加xmodmap ~/.Xmodmap
到我的.xsession
.令我失望的是,这实际上并没有起作用。
作为参考,我i3
在startx
没有 DM 的情况下运行。
为了测试命令是否成功运行,我将 my 中的命令替换.xsession
为touch ~/prior && xmodmap ~/.Xmodmap && touch ~/post
.实际上创建的文件表明该xmodmap
命令确实正确运行,但映射在某处重置,可能是通过调用setxkbmap
.
我搜索了解决方案,但只找到了没有答案的问题,或者有旧答案的问题对我不起作用,或者不包含真正的解决方案:
答案1
我发现这种行为的原因间接记录在man keyboard
:
描述
键盘文件描述了键盘的属性。它的读取者是设置con(1)为了在控制台上配置键盘。在 Debian 系统中,默认键盘布局在 /etc/default/keyboard 中描述它在 X 和控制台之间共享。
的内容/etc/default/keyboard
是在系统安装时生成的,并提示了实际问题(我ctrl:nocaps
后来添加了该选项):
XKBMODEL="pc105"
XKBLAYOUT="se"
XKBVARIANT=""
XKBOPTIONS="ctrl:nocaps"
以上共同表明 X 将在启动期间的某个时刻(可能是之后.xsession
等)设置 xkb 选项,这会导致xmodmap
期间设置的任何设置.xsession
丢失。
那么原因就出来了,解决办法来自man setupcon
:
键盘配置在 ~/.keyboard 或 /etc/default/keyboard 中指定。这字体配置 在 ~/.console-setup 中指定或/etc/default/控制台设置。
检查man console-setup
产量:
文件 console-setup 指定 setupcon(1) 为了设置控制台而使用的编码和字体。 它还可用于指定键盘布局但不建议这样做,请使用键盘(5)代替。
So/etc/default/keyboard
用于设置 TTY 和 X 的键盘设置。 While/etc/default/console-setup
可用于仅设置控制台的键盘(不真正推荐,但有效)和字体。
因此,为了使这一切顺利进行,我/etc/default/keyboard
将/etc/default/console-setup
以下内容添加到我的.xsession
:
#!/bin/bash
# The below assumes bash features, rewrite if you use other shells.
source /etc/default/console-setup
XKBPARMS=""
if [[ "$XKBLAYOUT" ]]; then
XKBPARMS="-layout $XKBLAYOUT"
fi
if [[ "$XKBMODEL" ]]; then
XKBPARMS+=" -model $XKBMODEL"
fi
if [[ "$XKBVARIANT" ]]; then
XKBPARMS+=" -variant $XKBVARIANT"
fi
if [[ "$XKBOPTIONS" ]]; then
XKBPARMS+=" -option $XKBOPTIONS"
fi
if [[ "$XKBPARMS" ]]; then
setxkbmap $XKBPARMS
fi
xmodmap ~/.Xmodmap
现在xmodmap
工作正常,我在 TTY 和 X 中都有正确的键盘映射和选项。
答案2
我也遇到了xmodmap
-type 解决方案的问题,所以经过一番研究后我决定直接使用xkb
。我还发现archwiki 不推荐xmodmap
任何“最简单”的任务:
一般来说,不建议使用 xmodmap,除非是最简单的任务。 xmodmap 的 XKB 兼容等效项是 xkbcomp;然而,xkbcomp 缺少 -e 选项,所以事情没那么简单。无论如何,只要有可能,xkbcomp 应该是首选。
以下解决方案对我有用(在 Ubuntu 16.04 上):
- 在 TTY 中:如何在 Linux 中更改控制台键盘映射。
- 中
X
:备份并修改中的相关文件/usr/share/X11/xkb/symbols/
。我对us
(数字行和其他一些内容)和pc
(大写锁定)进行了更改。
不幸的是,这确实意味着要跟踪X
TTY 和 TTY 的两个单独的解决方案,但到目前为止我觉得还不错。
但如果您xmodmap
已经有了一个有效的解决方案,那就很重要了!