xmodmap 如何重新映射键并禁用原始键?

xmodmap 如何重新映射键并禁用原始键?

我正在考虑购买一款 60% 的键盘,并且想在购买实际键盘之前尝试使用该布局。

我正在尝试将箭头键映射到 caps lock + ijkl 并禁用真正的箭头键。我已经找到了如何重新映射它的方法,但是当我尝试禁用真正的箭头键时,重新映射的箭头键会中断。这是一个有效的映射:

keycode 66 = Mode_switch
keycode 31 = i I Up
keycode 44 = j J Left
keycode 45 = k K Down
keycode 46 = l L Right

为了禁用向上箭头我添加

keycode 111 =

一旦我这样做,ijkl 就不再作为字符使用,而是充当箭头,即使没有按下修饰符(大写锁定)。如何在不破坏之前的映射的情况下禁用箭头键?

答案1

在阅读并了解一些信息后,问题似乎在于您必须在实际进行重新映射之前删除修饰符。

答案是:

更改设置后我的xmodmap样子如下:

xmodmap:每个修饰符最多 4 个键,(括号中为键码):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock      
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Alt_L (0xcc),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        Mode_switch (0x42),  Mode_switch (0xcb)
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce)
mod5      

调查使我们得出已成功映射的Mode_switch结论:Caps_Lock

[smalltalk@localhost ~]$ xmodmap -pke | egrep -e '(Mode_switch)'
keycode  66 = Mode_switch NoSymbol Mode_switch
keycode 203 = Mode_switch NoSymbol Mode_switch

现在 xmodmap 手册页的摘录:

       keycode NUMBER = KEYSYMNAME ...
               The list of keysyms is assigned to the indicated keycode (which
               may be specified in decimal, hex or octal and can be determined
               by running the xev  program).   Up  to  eight  keysyms  may  be
               attached  to  a  key, however the last four are not used in any
               major X server implementation.  The first keysym is  used  when
               no  modifier  key  is pressed in conjunction with this key, the
               second with Shift, the third when the Mode_switch key  is  used
               with  this  key  and  the  fourth when both the Mode_switch and
               Shift keys are used.

以下配置有效,但在使用 i、j、k、l 时必须按住 Caps_Lock(与手册页中所写完全一致):

编辑vim ~/.Xmodmap

! make Capslock the "Mode_switch" key
clear Lock

! All Mod must be cleared
clear Mod1
clear Mod2
clear Mod3
clear Mod4
clear Mod5

! clearning current Caps_Lock assigment and assigning it new one
keycode 66 =
keycode 66 = Mode_switch

! setting all the modification keys
add Mod1 = Alt_L Alt_R Meta_L
add Mod2 = Num_Lock
add Mod3 = Mode_switch
add Mod4 = Super_L Super_R Hyper_R

! Clear must be done before configuring it
keycode 31 =
keycode 44 =
keycode 45 =
keycode 46 =

! Configuration (first column normal type, second with shift and second with Mod_switch)
keycode 31 = i I Up
keycode 44 = j J Left
keycode 45 = k K Down
keycode 46 = l L Right

! Clearing the arrow keys and some functional keys like home
keycode 111 =
keycode 113 =
keycode 114 =
keycode 116 =
keycode 112 =
keycode 117 =

现在来谈谈最重要的问题:

如何让 i、j、k、l 键在 Caps_Lock 开启时起作用?您可能需要对 进行更改xkb,我必须仔细考虑一下。

编辑

是的,你可以。我已经知道了。

注意:这适用于所有键盘、所有布局,因此适合测试。如果要xkb正确执行此操作,您必须创建自己的布局并让 group1 和 group2 + 进行映射。

下面是一个非常适合测试你的键盘的方法(不要忘记备份你的../basic文件!):

警告这适用于所有键盘、所有变体。

编辑文件: sudo vim /usr/share/X11/xkb/compat/basic

# Add  Caps_Lock to virtual modifiers
    virtual_modifiers  NumLock,AltGr,Caps_Lock;

# change FROM:
    interpret Mode_switch {
        useModMapMods= level1;
        virtualModifier= AltGr;
        action= SetGroup(group=+1);
    };

# TO:
    interpret Mode_switch {
        useModMapMods= level1;
        virtualModifier= Caps_Lock;
        action= LockGroup(group=+1);
    };

# change from
    group 2 = AltGr;
TO:
    group 2 = Caps_Lock;

注意:如果您有多个布局,则可能会互相干扰。

答案2

抱歉,我写了答案而不是评论,但我的声誉还不够。我知道这不能回答你的问题,但它可以解决你的问题。

您可能不想在操作系统上重新映射按键,而是想购买支持重新映射按键的键盘。尤其是支持QMK 固件。您可以找到所有兼容键盘的列表这里

使用此固件,您可以将任何按键映射到任何操作,包括添加多个层,每个按键可以执行不同的操作。想象一下,就像按下笔记本电脑上的 fn 键一样,但它是完全可自定义的。您可以选择哪个键激活哪个层,甚至可以选择如何激活。例如,您可以让它打开/关闭层,按住按键时保持层处于活动状态等。这样,您可以Caps LockCaps Lock点击时处于活动状态,按住时切换到另一个层(其中的ijkl按键是箭头键)。

唯一的缺点是重新映射需要你在 C 代码中编辑数组,尽管它实际上非常简单,不需要任何编程知识。文档非常广泛并且解释了入门所需的一切。

60% 键盘选项有很多,但大多数都是需要您自己组装的套件。如果您对此没有问题,请查看 GH60、Satan 或 XD60 主板。您可以在以下位置找到所有这些产品如果您不想自己组装,您可以查看白狐键盘或看看你是否能找到一些东西KBDFans 商店因为他们为大多数套件提供组装服务。

相关内容