我想重新映射大写锁定以逃脱在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
重新登录后应恢复系统默认值。
看这里。