按键映射:组合键到组合键

按键映射:组合键到组合键

简而言之,我想将 Ctrl+H/L 映射到 Ctrl+Left/Right,而无需autokey,并且xbindkeys+ xdotool/xvkbd不起作用。详细信息如下:

我现在用来autokey实现映射,效果很好,但是在某些应用中会失效,因为autokey是高级应用。所以我想实现一个低级的按键映射。

xmodmap和等应用程序xkb无法执行此操作,因为 Ctrl+Left/Right 不是键符。我试过xbindkeys+ xdotool。以下配置脚本xbindkeys不起作用:(为了简化问题,我将键映射到“a”而不是 Ctrl+Left/Right)

#.xbindkeys
"xdotool key a"
Control+h

我认为这是因为按下的键影响了的执行xdotool,因为以下工作原理:

#.xbindkeys
"xdotool key --clearmodifier a"
Control+h+Release

但我只是不想在释放按键时触发命令,而是希望它在按下按键时立即生效,所以我将配置更改为:

#.xbindkeys
"xdotool keyup h; xdotool key --clearmodifier a"
Control+h

这个配置还是可以的,但是不能实现自动重复,就是我长按键盘不放,命令只执行一次,我也试过了,xvkbd但是现在不行了:

#.xbindkeys
"xvkbd -text 'a'"
Control+h

有人能帮我实现我的按键映射吗?

答案1

抱歉,我低估了 xkb 的功能,它的功能比我想象的要多得多。它是 X-server 最基本、最全面的键盘管理器。我使用 xkb 满足了我的要求。非常有用的教程可以在Arch Linux Wiki 上的这里,如果你也对如何做到这一点感兴趣。也欢迎就此主题发表帖子。

以下是我的案例的详细信息(尽管我强烈建议阅读链接页面,因为它非常有用并且不太长):

首先,获取您当前的键盘布局:

xkbcomp $DISPLAY ~/.config.xkb

然后使用某些编辑器(例如 vscode)打开该.config.xkb文件。您可以看到该文件由 5 个块组成(键码、类型、兼容性、符号、几何):

xkb_keymap {
xkb_keycodes "..." {...};
xkb_types "..." {...};
xkb_compatibility "..." {...};
xkb_symbols "..." {...};
xkb_geometry "..." {...};
}

xkb_types块中添加:

type "newType" {
    modifiers= Shift+Control;
    map[Shift]= Level2;
    map[Control]= Level3;
    map[Shift+Control]= Level3;
    level_name[Level1]= "Base";
    level_name[Level2]= "Shift";
    level_name[Level3]= "Control";
};

在该xkb_symbols块中,找到以下两个子块:

key <AC06> {
    type= "ALPHABETIC",
    symbols[Group1]= [               h,               H ]
};
key <AC09> {
    type= "ALPHABETIC",
    symbols[Group1]= [               l,               L ]
};

并将这两个子块更改为:

key <AC06> {
    type= "newType",
    symbols[Group1]= [               h,               H,            Left ],
    actions[Group1]= [      NoAction(),      NoAction(),   RedirectKey(keycode=<LEFT>) ]
};
key <AC09> {
    type= "newType",
    symbols[Group1]= [               l,               L,            Right ],
    actions[Group1]= [      NoAction(),      NoAction(),   RedirectKey(keycode=<RGHT>) ]
};

最后,将键盘布局重置为修改后的键盘布局:

xkbcomp ~/.config.xkb $DISPLAY

附录

如果有人想知道如何映射到左/右而不是 Control+左/右,我添加了附录。

xkb_symbols唯一的变化是将块中的子块替换为

key <AC06> {
    type= "newType",
    symbols[Group1]= [               h,               H,            Left ],
    actions[Group1]= [      NoAction(),      NoAction(),   RedirectKey(keycode=<LEFT>, clearmods=Control) ]
}

相关内容