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

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

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

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

这是我使用 xmodmap 的尝试:

# ~/.xinitrc
xmodmap ~/.xmodmap

# ~/.xmodmap
remove Lock = Caps_Lock
keysym Caps_Lock = Escape

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

我用 setxkbmap 尝试了一些方法,但都不起作用。下面的两次尝试分别在不同的时间出现在文件中。

# ~/.xinitrc
setxkbmap -option caps:esc     # attempt 1
setxkbmap -option esc:nocaps   # attempt 2

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

.xinitrc 是否使用了错误的文件?我知道 startx 是从 ~/.xinitrc 加载的。

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

答案1

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

.xinitrc:

xmodmap -e "clear lock"
xmodmap -e "keycode 9 = Caps_Lock NoSymbol Caps_Lock"
xmodmap -e "keycode 66 = Escape NoSymbol Escape"

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"

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

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

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

打开文件后,我手动切换了 Escape 和 Caps_Lock 各自的键(结果如下所示)。由于这会影响 X 将硬件映射到键符号的方式,因此无论您使用的是 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                  ]       };

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

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

希望这能解决问题!

答案2

两种可能性:

1).xinitrc未运行 - xinit、startx 和其他一些方法使用它来启动 X 会话,但并未得到普遍支持 - 您可能正在使用不运行它的显示管理器。在 .xinitrc 中添加一些内容touch /tmp/xinitrc-was-run可以帮助确定是否是这种情况。

2) 当没有客户端连接时,Xorg 自动重置为默认设置 - 如果 .xinitrc 在窗口管理器或其他任何东西开始运行之前完成,则 xmodmap 或 setxkbmap 更改将丢失。

如果您想要使用已定义的 XKB 选项,则无需在每次 Xorg 启动时运行程序来更改设置,您只需告诉 Xorg 已使用正确的设置启动即可。例如,为了启用 Ctrl-Alt-Backspace 键来终止我的 Xserver,我安装了一个名为的文件,/etc/X11/xorg.conf.d/90-zap.conf其中包含:

# This configuration snippet enables the Ctrl-Alt-Backspace server kill key
# 
# To use it, link or copy into /etc/X11/xorg.conf.d/
#
# Note that only the last XkbOptions setting seen for a device will be used,
# so to use multiple options, copy this file and add options into the Option
# string, such as "terminate:ctrl_alt_bksp,ctrl:swapcaps"

Section "InputClass"
    Identifier "keyboard zap by default"
    MatchIsKeyboard "on"

    Option "XKbOptions" "terminate:ctrl_alt_bksp"
EndSection

您可以在 X.Org 文档中阅读有关此内容的更多信息:https://www.x.org/releases/X11R7.7/doc/xorg-docs/input/XKB-Config.html

答案3

您可以将 XkbOptions 放入 X11 配置文件中。

例如,要交换 CapsLock 和 Escape,您可以使用/etc/X11/xorg.conf.d/00-keyboard.conf类似于:

# Written by systemd-localed(8), read by systemd-localed and Xorg. It's
# probably wise not to edit this file manually. Use localectl(1) to
# instruct systemd-localed to update it.
Section "InputClass"
    Identifier "system-keyboard"
    MatchIsKeyboard "on"
    Option "XkbLayout" "en"
    Option "XkbOptions" "caps:swapescape"
EndSection

如果您运行的是 GNOME,请注意:

GNOME 使用 gnome-settings-daemon 来管理键盘配置。它的键盘管理器使用 GSettings 来存储键盘配置,仅使用 xkb 配置进行初始设置 [...]

您可以使用以下命令清理设置

   gsettings reset org.gnome.desktop.input-sources xkb-options 
   gsettings reset org.gnome.desktop.input-sources sources

重新登录后应恢复系统默认值。

这里

相关内容