简而言之,我想将 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) ]
}