`xmodmap` 在启动时不起作用

`xmodmap` 在启动时不起作用

我最近安装了 Debian 9 并插入了我常用的~/.Xmodmap文件并添加xmodmap ~/.Xmodmap到我的.xsession.令我失望的是,这实际上并没有起作用。

作为参考,我i3startx没有 DM 的情况下运行。

为了测试命令是否成功运行,我将 my 中的命令替换.xsessiontouch ~/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 上):

不幸的是,这确实意味着要跟踪XTTY 和 TTY 的两个单独的解决方案,但到目前为止我觉得还不错。

但如果您xmodmap已经有了一个有效的解决方案,那就很重要了!

相关内容