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


9

我想重新映射大写锁定以在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中的某些内容,请同时显示文件和所有必需的内容(我也可以处理被告知将某些内容追加到末尾的操作,但是如果需要&或类似内容,请告诉我)。


2
.xinitrcsetxkbmap -option caps:escape
jasonwryan

1
运行xmodmap.xinitrc应该工作。是我做的 也许映射一些不寻常的东西,以确保在启动x时它确实在运行?另外,您使用什么窗口管理器/桌面环境?KDE会定期“纠正”我的键盘映射,而无需告诉我。也许检查您的桌面设置,以确保没有任何东西在xmodmap背后运行。
yellowantphil,2015年

jasonwryan:在.xinitrc中都尝试过;没用。它确实从命令行工作!所以有一个开始。我认为Yellowantphil是对的- ~/.xinitrc不会被淘汰。我正在使用i3wm,现在没有DE,尽管我尝试时在万神殿也发生了同样的事情。据我所知,i3不会弄乱xinitrc或加载它自己(但我是菜鸟,所以我知道什么?)。
ethanmad

您也可以尝试将其包含Option "XkbOptions" "caps:escape"X键盘配置文件中,例如/etc/X11/xorg.conf.d/10-keyboard.conf
don_crissti 2015年

Answers:


5

编辑:正如一个有用的用户指出的那样,我的最初解决方案将无法在更新中幸免。他在评论中的解决方案应该起作用。如果您更喜欢交换 Caps Lock和Escape,则建议您从.xinitrc或i3 config中添加以下命令:

.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将硬件映射到键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                  ]       };

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

在浏览相关文件时,我发现重复提及和部分实现了用于切换某些键的标记的部分实现,例如交换Escape和Caps Lock。我假设这就是Gnome Tweak工具和setxkbmap所使用的。但是,我无法弄清楚如何使用i3窗口管理器保持这些标志。上述解决方案应该可以正常工作。

希望这能解决问题!


在您的i3配置中:exec --no-startup-id setxkbmap -layout whatever -variant whatever -option caps:escape
quixotic

请注意,您对系统...xkb/symbols/pc文件的更改将在下一次覆盖xkeyboard-configxkb-data更新软件包时被覆盖。
quixotic

1

两种可能性:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.