如何在 X11 中永久地将大写锁定重新映射到 esc?

eth*_*mad 9 xorg keyboard xmodmap

我想重新映射大写锁定以在 X11 中转义(即按下物理大写锁定按钮将被应用程序解释为 esc 并且 esc 的行为不会改变)。解决方案必须在 X restart 后继续存在xmodmap 和 setxkbmap 是可接受的解决方案(类似的程序也是如此)。我不想处理 GUI,因为我希望解决方案是可移植的并且是我的 dotfiles 的一部分。如果我错过了更好/更简单/更明显的解决方案,请告诉我,但请注意我没有使用 DE(试用 i3wm)。

到目前为止,我已经尝试使用 xmodmap 和 setxkbmap 但收效甚微。

这是我使用 xmodmap 的尝试:

# ~/.xinitrc
xmodmap ~/.xmodmap
Run Code Online (Sandbox Code Playgroud)

# ~/.xmodmap
remove Lock = Caps_Lock
keysym Caps_Lock = Escape
Run Code Online (Sandbox Code Playgroud)

$ xmodmap ~/.xmodmap从命令行运行可以运行并执行我想要的操作。问题是每次 x 重新启动时都会重置。那就是我希望 xinitrc 进来的地方——它不应该在每次 x 启动并运行 xmodmap 命令时加载吗?如果该命令有效,为什么从文件读取时它不执行任何操作?

我已经用 setxkbmap 尝试了几件事,但都没有奏效。下面的两次尝试在不同的时间出现在文件中。

# ~/.xinitrc
setxkbmap -option caps:esc     # attempt 1
setxkbmap -option esc:nocaps   # attempt 2
Run Code Online (Sandbox Code Playgroud)

这两个命令都没有从命令行中执行任何可察觉的操作,因此我假设我的命令有误。我喜欢这个解决方案的想法,因为它是单行的,不需要其他文件中的任何内容。如果它奏效就好了。

.xinitrc 是要使用的错误文件吗?我知道 startx 正在从 ~/.xinitrc 加载。

我要求可能的解决方案包含整个文件,而不仅仅是一行(如果文件中需要多于一行),所以我不会弄乱某些中间步骤。例如,如果我需要 .xinitrc 中的某些内容和 .xcapsrebind 中的某些内容,请同时显示文件和所有必需的内容(我也可以处理被告知在末尾附加某些内容,但如果可能需要 & 或类似内容,请告诉我)。

小智 5

编辑:正如一位乐于助人的用户所指出的,我的初始解决方案将无法在更新后继续存在。他在评论中的解决方案应该有效。如果您更喜欢交换Caps Lock 和 Escape,我建议从您的 .xinitrc 或 i3 配置中添加以下命令:

.xinitrc:

xmodmap -e "clear lock"
xmodmap -e "keycode 9 = Caps_Lock NoSymbol Caps_Lock"
xmodmap -e "keycode 66 = Escape NoSymbol Escape"
Run Code Online (Sandbox Code Playgroud)

i3 配置文件(通常位于 .config/i3/config 或 .i3/config)

# swap caps lock and escape
exec_always --no-startup-id xmodmap -e "clear lock"
exec_always --no-startup-id xmodmap -e "keycode 9 = Caps_Lock NoSymbol Caps_Lock"
exec_always --no-startup-id xmodmap -e "keycode 66 = Escape NoSymbol Escape"
Run Code Online (Sandbox Code Playgroud)

我意识到这个问题已经很老了,但我想我可能会为我们这些仍在努力解决这个问题的人添加一个答案。

在某些 DE 未加载出现类似问题后~/.xinitrc,我完全避免了 xmodmap,直接去/usr/share/X11/xkb/symbols修改了 key=>symbol 映射。

为此,我编辑了位于/usr/share/X11/xkb/symbols. 对于大多数键盘,这应该是pc文件。

打开文件后,我手动切换了 Escape 和 Caps_Lock 各自的键,结果如下所示)。由于这会影响 X 将硬件映射到关键 Symbol 的方式,因此无论您使用的是 GNOME 还是 i3 或类似的系统,它都应该可以工作。

我生成的文件的片段如下:

default  partial alphanumeric_keys modifier_keys

xkb_symbols "pc105" {

    key <ESC>  {        [ Caps_Lock             ]       };

    // The extra key on many European keyboards:
    key <LSGT> {        [ less, greater, bar, brokenbar ] };

    // The following keys are common to all layouts.
    key <BKSL> {        [ backslash,    bar     ]       };
    key <SPCE> {        [        space          ]       };

    include "srvr_ctrl(fkey2vt)"
    include "pc(editing)"
    include "keypad(x11)"

    key <BKSP> {        [ BackSpace, BackSpace  ]       };

    key  <TAB> {        [ Tab,  ISO_Left_Tab    ]       };
    key <RTRN> {        [ Return                ]       };

    key <CAPS> {        [ Escape                ]       };
    key <NMLK> {        [ Num_Lock              ]       };

    key <LFSH> {        [ Shift_L               ]       };
    key <LCTL> {        [ Control_L             ]       };
    key <LWIN> {        [ Super_L               ]       };

    key <RTSH> {        [ Shift_R               ]       };
    key <RCTL> {        [ Control_R             ]       };
    key <RWIN> {        [ Super_R               ]       };
    key <MENU> {        [ Menu                  ]       };
Run Code Online (Sandbox Code Playgroud)

这对我来说就像一种魅力。

在查看相关文件时,我发现重复提及和部分实现了用于切换某些键的某种标志,例如交换 Escape 和 Caps Lock。我假设这是 Gnome Tweak Tool 和 setxkbmap 使用的;但是,我不知道如何使用 i3 窗口管理器保持这些标志。上述解决方案应该可以正常工作。

希望这能解决问题!